Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 2005 带有select SQL Server的原子更新语句_Sql Server 2005 - Fatal编程技术网

Sql server 2005 带有select SQL Server的原子更新语句

Sql server 2005 带有select SQL Server的原子更新语句,sql-server-2005,Sql Server 2005,我想在SQLServer2005SP1中使用原子语句 有没有一种方法可以在不修改隔离级别的情况下执行此操作 我需要模拟一个插入到一个带有标识列作为pk的表中的操作。我当前的表没有pk的标识字段,但它需要像pk一样操作。因此,我需要获得伪ID字段的最大值,并添加1,然后插入下一行。要锁定该值,一种方法是使用可序列化隔离级别 INSERT stuff SET computed = 'working' WHERE id = (SELECT max(id) from STUFF WHERE x = y)

我想在SQLServer2005SP1中使用原子语句

有没有一种方法可以在不修改隔离级别的情况下执行此操作


我需要模拟一个插入到一个带有标识列作为pk的表中的操作。我当前的表没有pk的标识字段,但它需要像pk一样操作。因此,我需要获得伪ID字段的最大值,并添加1,然后插入下一行。

要锁定该值,一种方法是使用可序列化隔离级别

INSERT stuff
SET computed = 'working'
WHERE id = (SELECT max(id) from STUFF WHERE x = y)

确保它尽可能短。

要锁定该值,一种方法是使用可序列化隔离级别

INSERT stuff
SET computed = 'working'
WHERE id = (SELECT max(id) from STUFF WHERE x = y)

请确保它尽可能短。

如果不能添加标识列,是否可以创建另一个包含标识列的表?然后只需插入到该表中并使用@标识即可插入到需要序列的表中。这项技术将为您记住最后一个数字,这样您就不会得到任何重复使用的值

在2012年以前版本的SQL Server中,也使用了类似的技术来模拟Oracle的序列(与表无关)


如果愿意,您可以将这些序列表放入单独的模式。

如果您不能添加标识列,您可以创建另一个包含标识列的表吗?然后只需插入到该表中并使用@标识即可插入到需要序列的表中。这项技术将为您记住最后一个数字,这样您就不会得到任何重复使用的值

在2012年以前版本的SQL Server中,也使用了类似的技术来模拟Oracle的序列(与表无关)



如果愿意,您可以随时将这些序列表放入一个单独的模式。

我建议您在这个问题上增加更多关于您期望的内容,更多关于系统的其他移动部分(将要使用的其他SQL),还有更多关于这个系统目标的信息。我很困惑,因为你似乎试图用更新而不是插入来模拟身份行为。@cade roux修复。感谢您注意到,您是想重用最大的“身份”值,还是想增加它,还是有什么奇怪的事情发生了?可以从
stuff
stuff
中删除行吗?回收以前的值会有问题吗?@HABO我不打算重新使用max,行可以删除,我也不打算回收以前的值。我建议你在这个问题上多加一些你所期望的,更多关于系统其他移动部分(其他SQL将继续)的内容,还有更多关于这个系统目标的信息。我很困惑,因为你似乎试图用更新而不是插入来模拟身份行为。@cade roux修复。感谢您注意到,您是想重用最大的“身份”值,还是想增加它,还是有什么奇怪的事情发生了?可以从
stuff
stuff
中删除行吗?回收以前的值会有问题吗?@HABO我不打算重新使用max,行可以删除,我不打算回收以前的值。修改了我的问题,使其更容易理解。我不想将其包装在可序列化的转换中,但我找到了其他方法。所以谢谢你的支持reconfirming@gh9-即使最后一行被删除,您如何解决始终分配以前未使用的值的问题?@HABO我认为OP意味着删除的值(间隙)将不会被重复使用,但如果最大值已被删除,作为新id,这是公平的游戏。你确定SELECT会正确地锁定吗?修改了我的问题,使其更容易理解。我不想将其包装在可序列化的转换中,但我找到了任何其他方法。所以谢谢你的支持reconfirming@gh9-即使最后一行被删除,您如何解决始终分配一个以前未使用的值的问题?@HABO我认为OP意味着删除的值(间隙)将不会被重复使用,但如果最大值被删除,重新作为新id是公平的。您确定选择将正确锁定吗?