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

Kem*_*gan 1 sql-server sequences sqlclr clr-hosting

我想有一个SQL Server函数dbo.GetNextNumber(),它将为每个调用生成序列号.据我所知,使用本机T-SQL函数是不可能的,因为SQL Server坚持认为函数必须是确定性的.但是,如果你能告诉我一个原生的T-SQL函数,这将真正成为我的一天.

我想也许可以使用CLR函数编写.由于CLR函数是静态的,序列号需要存储在set操作的调用上下文中,因为将其存储为静态变量将导致使用相同序列的多个连接,从而导致不那么顺序的数字.我对嵌入式CLR知之甚少,看看是否可以从CLR端访问set操作(select,update,delete,insert)调用上下文.

在一天结束时,以下查询

select dbo.GetNextNumber() from sysobjects
Run Code Online (Sandbox Code Playgroud)

必须返回结果

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

如果需要另一个函数调用来重置上下文就好了

exec dbo.ResetSequenceNumbers()
Run Code Online (Sandbox Code Playgroud)

为了防止一些误解并减少浪费时间回答错误问题的机会,请注意我不是在寻找一个表的ID生成函数,而且我知道一些hacks(虽然使用proc而不是函数)涉及到一些带有标识列的临时表.该ROW_NUMBER()功能是接近,但它也不会削减.

非常感谢任何回复

凯末尔

PS令人惊讶的是,SQL Server确实具有内置功能.一个函数(假设它不能在连接和where子句中使用)非常容易实现并且非常有用,但由于某种原因它不包括在内.

小智 5

由于您已经根据我的与Running Totals计算相关的文章实现了CLR序列,您可以使用该ROW_NUBER()函数实现相同的目的.

ROW_NUMBER()函数需要ORDER BYOVER子句中,但有一个很好的解决方法如何避免由于的排序ORDER BY.你不能按顺序放置表达式,但你可以放在SELECT aConstant那里.因此,您可以使用以下语句轻松实现数字生成.

SELECT
    ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNumber,
    *
FROM aTable
Run Code Online (Sandbox Code Playgroud)