2013-01-02 111 views
3

此問題之前已被問過......但我似乎無法找到我正在尋找的確切答案......我需要插入一堆記錄並取回插入的標識值...我這樣做:TSQL獲取插入的ID

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

這工作得很好......

輸入SQL事務複製與更新訂閱,這使對用戶複製表上的觸發器。

輸出不再在這種情況下工作...

所以,現在我在做這個......但我有一種不好的預感在我的這個直覺,我覺得我已經打開大門一個併發問題(雖然我不積極)。

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 

建議?這也很糟糕,因爲該方法不適用於生成的uniqueidentifiers。

+0

爲什麼您的第一條語句不能用於複製?似乎它是第二個由於ID分區而複製的問題。 – RBarryYoung

+1

如果表上有任何觸發器,則不能使用OUTPUT語法。 – Jeff

回答

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 

這將有大致相同的行爲原來,除非你正在處理例如行計數消息。

+0

但是後來我無法獲得身份證明......不是嗎? – Jeff

+0

@ JeffN825 - 我不確定你在問什麼。如果你的第一個查詢(使用'OUTPUT'沒有'INTO')產生你想要的結果集,那麼我顯示的查詢(修改爲包含'INTO')應該產生完全相同的結果。即使表格上定義了觸發器,它也會工作,這就是您說的問題所在。 –

+0

我看,現在試着,謝謝! – Jeff