我希望有一个SQL Server函数dbo.GetNextNumber()
,它可以为每个调用生成序号。据我所知,使用本地T-SQL函数是不可能的,因为SQL Server坚持认为函数必须是确定性的。但是,如果你能向我展示一个原生T-SQL函数,那么这真的会让我有一天的时间。用于生成连续号码的SQL Server函数
我想也许这可能是使用CLR函数编写的。由于CLR函数是静态的,因此序列号需要存储在set操作的调用上下文中,因为将其存储为静态变量会导致使用相同序列的多个连接,从而导致不那么连续的数字。我不太了解嵌入式CLR,以了解是否可以从CLR端访问set operation(select,update,delete,insert)调用上下文。
在一天结束的时候,下面的查询
select dbo.GetNextNumber() from sysobjects
必须返回结果
1
2
3
4
5
这是确定的,如果另一个函数调用来重置上下文是必要像
exec dbo.ResetSequenceNumbers()
为了避免一些误解,并减少浪费你的时间回答错误的任务离子,请注意,我没有寻找一个表的ID生成函数,我知道一些黑客(尽管使用proc而不是函数),涉及一些具有标识列的临时表。 ROW_NUMBER()
函数接近,但它也不会削减。
非常感谢任何反应
末尔
附:令人惊讶的是,SQL Server确实有一个内置的功能。一个函数(假设它不能在连接和where子句中使用)很容易实现,并且非常有用,但由于某种原因,它不包含在内。
而不是问一个“sql服务器函数dbo.GetNextNumber()”,告诉我们你正在尝试解决的问题。 –
您可以使用只有一个“ID INT IDENTITY(1,1)”列的“助手”表,并在每个INSERT后使用“SELECT SCOPE_IDENTITY()”来获取值,或者等待SQL Server“Denali “(2011/2012),它将[SEQUENCES as native database objects](http://sqlblog.com/blogs/aaron_bertrand/archive/2010/11/11/sql-server-11-denali-using-sequence.aspx )正是为了这个目的 –
SQL-Server函数不必是确定性的。在某些情况下,需要确定性函数(例如计算列)。 –