我有一个SQL脚本,用于插入数据(通过INSERT语句,当前编号为数千),其中一列包含一个唯一的标识符(尽管不是IDENTITY类型,只是一个普通的int值),实际上在几个不同的表中是唯一的。
我想在我的脚本中添加一个标量函数,以获取下一个可用的ID(即上次使用的ID + 1),但是我不确定这是可能的,因为似乎没有办法使用全局或从UDF内部获取静态变量,我不能使用临时表,也不能从函数内部更新永久表。
目前,我的脚本如下所示:
声明@v_baseID int exec dbo.getNextID @v_baseID out --sproc获取下一个可用的ID -很多-其中n是硬编码值 插入tableOfStuff(someStuff,uniqueID)值('stuff',@v_baseID + n) exec dbo.UpdateNextID @v_baseID + lastUsedn --sproc更新最后使用的ID 但我希望它看起来像这样:
-很多 插入tableOfStuff(someStuff,uniqueID)值('stuff',getNextID()) 对偏移量进行硬编码是一个麻烦,而且容易出错。将其打包成一个简单的标量函数非常吸引人,但是我开始认为不能那样做,因为似乎没有办法在调用之间保持偏移计数器。是吗,或者我缺少什么?
目前,我们正在使用SQL Server 2005。
编辑以澄清:
不会有两个用户点击它。这是一个升级脚本,将仅运行一次,并且永远不会同时运行。
实际的sproc没有以sp_为前缀,修复了示例代码。
在正常使用中,我们确实使用id表和sproc根据需要获取ID,我只是在寻找一种更干净的方法来执行此脚本,该脚本实际上只是将一堆数据转储到db中。
这可能比它值得的工作还要多,但是您可以在SQL CLR UDF中使用静态C#/ VB变量,因此我认为您可以通过每次UDF每次简单地递增此变量就可以完成您想做的事情叫。当然,只要卸载appdomain,静态变量就会丢失。因此,如果您需要一天到一天的ID连续性,则需要一种在首次访问NextId时轮询使用该ID的所有表的方法,以找到最大值。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。