sql-server - 用于生成序列号的 SQL Server 函数

我想要一个 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

https://stackoverflow.com/questions/7094897/

相关文章:

asp.net - 有什么简单的方法可以检查复选框列表控件中是否没有选择任何项目?

qt - 如何解决(不兼容的发送方/接收方参数)问题?

asp.net - CS0433 : The type 'CrystalDecisions.Web.

php - php中@字符的含义

php - 用 php domdocument 得到一个完整的表格并打印出来

vb.net - 与条件和逻辑运算符混淆 - VB.net

qt - 将插槽添加到自动创建的菜单项

asp.net - 检查文件夹在 C#.net 中是否只读

ruby-on-rails - bcrypt 解密器

android - 如何显示内部存储中的位图?