Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在调用SQL Server UDF之间保持状态吗?_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

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

我可以在调用SQL Server UDF之间保持状态吗?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有一个SQL脚本,它可以插入数据(通过当前编号为数千的INSERT语句),其中一列包含一个唯一标识符(虽然不是标识类型,只是一个普通的ol'int),该标识符在几个不同的表中实际上是唯一的 我想在脚本中添加一个标量函数来获取下一个可用ID(即上次使用的ID+1),但我不确定这是否可行,因为似乎没有办法从UDF中使用全局或静态变量,我不能使用临时表,也不能从函数中更新永久表 当前我的脚本如下所示: declare @v_baseID int exec dbo.getNextID @v_b

我有一个SQL脚本,它可以插入数据(通过当前编号为数千的INSERT语句),其中一列包含一个唯一标识符(虽然不是标识类型,只是一个普通的ol'int),该标识符在几个不同的表中实际上是唯一的

我想在脚本中添加一个标量函数来获取下一个可用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() ) 声明@v_baseID int exec dbo.getNextID@v_baseID out——获取下一个可用id的存储过程 --很多,其中n是硬编码值 将值('stuff',@v_baseID+n)插入到staff(someStuff,uniqueID)表中 exec dbo.UpdateNextID@v_baseID+lastUsedn——更新上次使用的id的存储过程 但我希望它看起来像这样:

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() ) --很多这样的 在tableOfStuff(someStuff,uniqueID)中插入值('stuff',getNextID()) 硬编码偏移量是一件麻烦事,而且容易出错。将它打包成一个简单的标量函数非常吸引人,但我开始认为不能这样做,因为似乎没有办法在调用之间保持偏移量计数器。是这样,还是我遗漏了什么

目前我们正在使用SQLServer2005

编辑澄清:

两个用户点击它不会发生。这是一个升级脚本,将只运行一次,而不会同时运行

实际存储过程的前缀不是sp_,修复了示例代码


在正常使用中,我们确实使用id表和存储过程来获取所需的id,我只是在这个脚本中寻找一种更干净的方法来实现这一点,它实际上只是将一组数据转储到数据库中

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

sp_getNextID


永远不要在procs前面加sp_u3;,这会影响性能,因为优化器首先检查主数据库是否存在该proc,然后检查本地数据库,另外,如果MS决定在service pack中创建一个sp_getNextID,您的sp将永远不会被执行

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

sp_getNextID


永远不要在procs前面加sp_,这对性能有影响,因为优化器首先检查主数据库,看看是否存在该proc,然后检查本地数据库,如果MS决定在service pack中创建sp_getNextID,您的将永远不会被执行

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

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

我开始认为这样做是不可能的,因为似乎没有办法保持通话之间的偏移计数器。是这样,还是我遗漏了什么

你没有错过任何东西;SQL Server不支持全局变量,也不支持在UDF中修改数据。即使您想做一些像使用CONTEXT_INFO(请参阅)这样笨拙的事情,您也不能在UDF中设置它

有没有一种方法可以绕过偏移量的“硬编码”,将其作为一个变量并在其迭代中循环,在循环中插入

我开始认为这样做是不可能的,因为似乎没有办法保持通话之间的偏移计数器。是这样,还是我遗漏了什么

你没有错过任何东西;SQL Server不支持全局变量,也不支持在UDF中修改数据。即使您想做一些像使用CONTEXT_INFO(请参阅)这样笨拙的事情,您也不能在UDF中设置它

有没有一种方法可以绕过偏移量的“硬编码”,将其作为一个变量并在其迭代中循环,在循环中插入