2008-08-26 35 views
1

我有一个插入数据的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,我只是寻找一种更干净的方式在此脚本中执行此操作,它基本上只是将一堆数据转储到数据库中。

回答

2

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

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

有没有一种方法可以解决偏移量的“硬编码”问题:通过创建一个变量并循环遍历迭代,在该循环内执行插入操作?

2

如果你有2个用户同时击中它们,他们将得到相同的ID。你为什么不使用一个ID表的身份,而不是插入到这一点,使用它作为唯一的(这是保证)的ID,这也将执行快得多

sp_getNextID

以sp_从来没有前缀的特效,这有表现暗示,因为优化器首先检查master数据库,看看是否能PROC存在那里,然后日本地数据库,另外如果MS决定创建一个服务sp_getNextID包你永远不会得到执行

0

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

相关问题