Sql server 2005 带有select SQL Server的原子更新语句
我想在SQLServer2005SP1中使用原子语句 有没有一种方法可以在不修改隔离级别的情况下执行此操作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)
我需要模拟一个插入到一个带有标识列作为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是公平的。您确定选择将正确锁定吗?