开发者社区> 问答> 正文

我可以在两次调用SQL Server UDF之间保持状态吗?

我有一个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中。

展开
收起
心有灵_夕 2019-12-25 20:43:45 911 0
1 条回答
写回答
取消 提交回答
  • 这可能比它值得的工作还要多,但是您可以在SQL CLR UDF中使用静态C#/ VB变量,因此我认为您可以通过每次UDF每次简单地递增此变量就可以完成您想做的事情叫。当然,只要卸载appdomain,静态变量就会丢失。因此,如果您需要一天到一天的ID连续性,则需要一种在首次访问NextId时轮询使用该ID的所有表的方法,以找到最大值。

    2019-12-25 20:44:06
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载