3

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

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

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

4

1 回答 1

4

您可以使用该变量的OUTPUT插入到表变量中。从文档中:

如果在未指定 INTO 关键字的情况下指定了 OUTPUT 子句,则 DML 操作的目标不能为给定的 DML 操作定义任何启用的触发器。例如,如果在 UPDATE 语句中定义了 OUTPUT 子句,则目标表不能有任何启用的 UPDATE 触发器。

重点补充)

因此,您可以拥有:

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

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

于 2013-01-02T07:25:30.460 回答