1

我有一个插入数据的 SQL 脚本(通过当前数以千计的 INSERT 语句)其中一列包含一个唯一标识符(虽然不是 IDENTITY 类型,只是一个普通的 ol'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 中。

4

3 答案 3

2

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

sp_getNextID

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

于 2008-08-26T15:05:58.943 回答
2

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

You aren't missing anything; SQL Server does not support global variables, and it doesn't support data modification within UDFs. And even if you wanted to do something as kludgy as using CONTEXT_INFO (see http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx), you can't set that from within a UDF anyway.

Is there a way you can get around the "hardcoding" of the offset by making that a variable and looping over the iteration of it, doing the inserts within that loop?

于 2008-08-27T07:14:44.853 回答
0

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

于 2008-08-27T06:07:01.257 回答