【发布时间】:2011-10-29 00:33:03
【问题描述】:
我想要一个 SQL Server 函数dbo.GetNextNumber(),它会为每个调用生成序列号。据我了解,使用本机 T-SQL 函数是不可能的,因为 SQL Server 坚持认为函数必须是确定性的。但是,如果您可以向我展示一个执行此操作的本机 T-SQL 函数,那真的会让我很开心。
我想也许这可以使用 CLR 函数来编写。由于 CLR 函数是静态的,因此序列号需要存储在 set 操作的调用上下文中,因为将其存储为静态变量会导致多个连接使用相同的序列,从而导致序列号不那么连续。我对嵌入式 CLR 了解得不够多,无法从 CLR 端访问设置操作(选择、更新、删除、插入)的调用上下文。
最后,下面的查询
select dbo.GetNextNumber() from sysobjects
必须返回结果
1
2
3
4
5
如果需要另一个函数来重置上下文是可以的,比如
exec dbo.ResetSequenceNumbers()
为了防止一些误解并减少浪费时间回答错误问题的机会,请注意,我不是在寻找表格的 ID 生成功能,而且我知道一些技巧(尽管使用 proc 不是函数)这涉及一些带有标识列的临时表。 ROW_NUMBER() 函数已关闭,但它也没有剪切。
非常感谢您的任何回复
凯末尔
附:令人惊奇的是,SQL Server 确实为此提供了内置函数。一个函数(前提是它不能用在连接和 where 子句中)确实很容易做并且非常有用,但由于某种原因它没有被包括在内。
【问题讨论】:
-
与其要求“sql server function dbo.GetNextNumber()”,不如告诉我们您实际要解决的问题。
-
您可以使用只有一个
ID INT IDENTITY(1,1)列的“帮助”表,并在每次插入后获取值(使用SELECT SCOPE_IDENTITY()),或者您可以等待 SQL Server“Denali”(2011 / 2012) 将有 SEQUENCES as native database objects 用于此目的 -
SQL-Server 函数不必是确定性的。在某些情况下,需要确定性函数(例如计算列)。
标签: sql-server sqlclr sequences clr-hosting