我有一个插入数据的SQL脚本(通过目前编号为数千的INSERT语句)其中一列包含一个唯一标识符(虽然不是IDENTITY类型,只是一个普通的ol'int),它在几个不同的表中实际上是唯一的。我可以在对SQL Server UDF的调用之间保持状态吗?
我想一个标量函数添加到我的脚本,获取下一个可用的ID(即最后一次使用ID + 1),但我不知道这是可能的,因为似乎没有成为一个办法使用UDF中的全局或静态变量,我不能使用临时表,并且我无法从函数内更新永久表。
目前我的剧本是这样的:
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。
编辑澄清:
两个用户打它不会发生。这是一个只能运行一次的升级脚本,并且不会同时运行。
实际的sproc没有用sp_作为前缀,修正了示例代码。
在正常使用情况下,我们使用id表和sproc来根据需要获取ID,我只是寻找一种更干净的方式在此脚本中执行此操作,它基本上只是将一堆数据转储到数据库中。