1

我想要一个 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 生成功能,而且我知道一些涉及到一些带有标识列的临时表。该ROW_NUMBER()功能很接近,但它也没有削减。

非常感谢您的任何回复

凯末尔

PS 令人惊讶的是,SQL Server 确实为此提供了内置函数。一个函数(前提是它不能在连接和 where 子句中使用)确实很容易做并且非常有用,但由于某种原因它没有被包括在内。

4

4 回答 4

5

由于您已经根据我与运行总计计算相关的文章实现了 CLR 序列,因此您可以使用该ROW_NUBER()函数实现相同的目的。

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

SELECT
    ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNumber,
    *
FROM aTable
于 2011-08-18T09:39:20.977 回答
2

你能提供更多关于为什么ROW_NUMBER()不削减它的信息吗?在您给出的具体示例中,ROW_NUMBER()(对 进行适当的澄清OVER(ORDER BY))当然似乎符合您的标准。

但肯定有一些ROW_NUMBER()可能没有用的情况,在这些情况下,通常还有其他技术。

也许拥有这个通用功能对您来说似乎很有用,但在大多数情况下,我发现一个更好地针对手头问题量身定制的解决方案比一个最终导致更多困难的通用功能更好 - 就像您一直在工作的泄漏抽象大约。您特别提到需要具有重置功能。不需要这样的东西ROW_NUMBER(),因为它具有OVER(PARTITION BY ORDER BY)允许您指定分组的 。

于 2011-08-17T15:08:52.747 回答
2

在 SQL Server 的下一版本中,您可以使用 SEQUENCE 来执行此操作。在早期版本中,通过插入单独的“序列表”(只有一个 IDENTITY 列的表)然后使用 SCOPE_IDENTITY() 函数检索值很容易。您将无法在函数中执行此操作,但可以使用存储过程。

于 2011-08-17T15:02:10.873 回答
0

SQL Server Denali 为开发人员提供了新的序列结构 Denali 之后在 SQL Server 中易于管理和维护序列号您可以在 SQL Server 中的序列号中找到详细信息

对于 Denali 以外的其他版本,您可以使用序列表。这是SQL Server中序列表的示例为了 从序列表中读取序列号,您应该从此启用自动标识的 sql 表中插入虚拟记录

于 2011-08-18T05:10:20.693 回答