TSQL获取插入的ID

时间:2013-01-02 05:49:52

标签: sql sql-server tsql

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

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

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

1 个答案:

答案 0 :(得分:4)

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

  

如果指定OUTPUT子句而未指定INTO关键字,则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

除非您正在处理,否则其行为与原始行为大致相同行计数消息。