我想要一个 SQL Server 函数 dbo.GetNextNumber()
,它会为每次调用生成序号。据我所知,这对于 native T-SQL 函数是不可能的,因为 SQL Server 坚持认为函数必须是确定性的。但是,如果您能向我展示执行此操作的 native T-SQL 函数,那将真的让我开心。
我想也许这可以使用 CLR 函数来编写。由于 CLR 函数是静态的,序列号需要存储在设置操作的调用上下文中,因为将其存储为静态变量会导致多个连接使用相同的序列,从而导致序列号不那么连续。我对嵌入式 CLR 的了解还不够,无法查看是否可以从 CLR 端访问设置操作的(选择、更新、删除、插入)调用上下文。
一天结束时,查询如下
select dbo.GetNextNumber() from sysobjects
必须返回结果
1
2
3
4
5
如果需要另一个函数调用来重置上下文也没关系,比如
exec dbo.ResetSequenceNumbers()
为了防止一些误解并减少浪费您的时间回答错误问题的机会,请注意我不是在寻找表的 ID 生成函数,而且我知道一些 hack(尽管使用的是 proc 而不是函数)这涉及一些带有标识列的临时表。 ROW_NUMBER()
函数已关闭,但它也不会剪切。
非常感谢任何回复
凯末尔
附言令人惊奇的是,SQL Server 确实为此提供了一个内置函数。一个函数(前提是它不能用在连接和 where 子句中)确实很容易做而且非常有用,但由于某些原因它没有被包括在内。
最佳答案
由于您已经根据我与计算运行总计相关的文章实现了 CLR 序列,因此您可以使用 ROW_NUBER()
函数实现相同的目的。
ROW_NUMBER()
函数需要 OVER
子句中的 ORDER BY
,但是有一个很好的解决方法如何避免排序由于ORDER BY
。您不能将表达式放在 order by 中,但可以将 SELECT aConstant
放在那里。因此,您可以使用以下语句轻松实现数字生成。
SELECT
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNumber,
*
FROM aTable
关于sql-server - 用于生成序列号的 SQL Server 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094897/