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

标签 sql-server sqlclr sequences clr-hosting

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

相关文章:

带有 varchar 参数的 SQL Server 存储过程返回错误的结果

mysql - 在 SQL 中,如何通过查找与一列相等的所有行来更新表的每一行,然后将另一列设置为彼此相等

.net - SQL Server 2017 上的 CLR 严格安全性

sql-server - SQL CLR - 即使用户具有访问权限,TSQL UDF 上仍出现权限错误

algorithm - 如何将递增序列号流压缩为一个?

c# - 使用 sql server 作业代理运行 .exe 时访问被拒绝

c# - 从不同的服务器获取 CLR Procedure 中的数据

php - MySql 数据库结构按顺序存储项目列表

diagram - 这些图的名称是什么?

sql - 将行转置为列并连接表