我有一个 SQL 脚本,用于插入数据(通过当前数量为数千的 INSERT 语句),其中一列包含唯一标识符(尽管不是 IDENTITY 类型,只是一个普通的 ol' int),该标识符在几个不同的表中实际上是唯一的。

我想在我的脚本中添加一个标量函数来获取下一个可用的 ID(即最后使用的 ID + 1) 但我不确定这是否可能,因为似乎没有办法在 UDF 中使用全局或静态变量,我不能使用临时表,而且我可以' t 从函数内更新永久表。

目前我的脚本如下所示:

   declare @v_baseID int 
   exec dbo.getNextID @v_baseID out  --sproc to get the next available id
   --Lots of these - where n is a hardcoded value
   insert into tableOfStuff (someStuff, uniqueID) values ('stuff', @v_baseID + n ) 
   exec dbo.UpdateNextID @v_baseID + lastUsedn  --sproc to update the last used id

但我希望它看起来像这样:

   --Lots of these
   insert into tableOfStuff (someStuff, uniqueID) values ('stuff', getNextID() ) 

对偏移量进行硬编码是一件很痛苦的事情,而且很容易出错。将其打包成一个简单的标量函数非常有吸引力,但我开始认为不能这样做,因为似乎没有办法维护调用之间的偏移计数器。是这样吗,还是我遗漏了什么。

我们目前使用的是 SQL Server 2005。

编辑澄清:

两个用户击中它不会发生。这是一个仅运行一次且绝不会同时运行的升级脚本。

实际的存储过程没有以 sp_ 为前缀,修复了示例代码。

在正常使用中,我们确实使用 id 表和存储过程来根据需要获取 ID,我只是在寻找一种更简洁的方法来在此脚本中执行此操作,该脚本本质上只是将一堆数据转储到数据库中。

有帮助吗?

解决方案

我开始认为不能这样做,因为似乎没有办法维护调用之间的偏移计数器。是这样吗,还是我遗漏了什么。

你没有遗漏任何东西;SQL Server不支持全局变量,也不支持UDF内的数据修改。即使你想做一些像使用 CONTEXT_INFO 那样笨拙的事情(参见 http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx),无论如何你都不能从 UDF 中设置它。

有没有一种方法可以通过将其设置为变量并循环遍历它,在该循环中进行插入来绕过偏移量的“硬编码”?

其他提示

如果您有 2 个用户同时点击它,他们将获得相同的 id。为什么你不使用带有身份的 id 表,插入其中并将其用作唯一(有保证)id,这也会执行得更快

sp_getNextID

永远不要在 procs 前加上 sp_ 前缀,这会对性能产生影响,因为优化器首先检查主数据库以查看该 proc 是否存在,然后检查本地数据库,而且如果 MS 决定在服务包中创建 sp_getNextID,则您的进程将永远不会被执行

这可能会比它的价值做更多的工作,但您可以在 SQL CLR UDF 中使用静态 C#/VB 变量,因此我认为您可以通过每次 UDF 时简单地增加此变量来完成您想做的事情叫。当然,每当应用程序域卸载时,静态变量就会丢失。因此,如果您需要 ID 从一天到下一天的连续性,则需要一种方法,在第一次访问 NextId 时,轮询使用该 ID 的所有表,以找到最高值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top