gpt4 book ai didi

sql - TSQL 获取插入的 ID

转载 作者:行者123 更新时间:2023-12-01 12:48:09 25 4
gpt4 key购买 nike

这个问题之前有人问过...但我似乎无法找到我正在寻找的确切答案...我需要插入一堆记录并取回插入的标识值...我正在这样做:

INSERT MyTable(col1, ....)
OUTPUT inserted.IdentityColumn
SELECT p.i.value('@XmlAttribute', 'nvarchar(128)') FROM @myXml.nodes('/root/i') AS p(i)

这很好用...

进入带有可更新订阅的 SQL 事务复制,它在订阅者的复制表上放置触发器。

OUTPUT 在这种情况下不再有效...

所以,我现在正在这样做......但我对此有一种不好的感觉,我认为我已经打开了并发问题的大门(尽管我并不乐观)。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE  
DECLARE @currentIdentity bigint
SET @currentIdentity = SELECT IDENT_CURRENT('MyTable') + 1
...
SELECT IdentityColumn FROM MyTable WHERE IdentityColumn <= IDENT_CURRENT('MyTable') AND IdentityColumn >= @currentIdentity

建议?这也很糟糕,因为该方法不适用于生成的唯一标识符。

最佳答案

您可以使用插入表变量的 OUTPUT 变体。来自documentation :

If the OUTPUT clause is specified without also specifying the INTO keyword, the target of the DML operation cannot have any enabled trigger defined on it for the given DML action. For example, if the OUTPUT clause is defined in an UPDATE statement, the target table cannot have any enabled UPDATE triggers.

(添加了强调)

所以,你可以:

DECLARE @IDs table (ID int not null)
INSERT MyTable(col1, ....)
OUTPUT inserted.IdentityColumn INTO @IDs
SELECT p.i.value('@XmlAttribute', 'nvarchar(128)') FROM @myXml.nodes('/root/i') AS p(i)

SELECT * from @IDs

这将具有与原始行为大致相同的行为,除非您正在处理例如行计数消息。

关于sql - TSQL 获取插入的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14117435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com