2011-04-26 101 views
13

SET IDENTITY_INSERT xyz ON的範圍是什麼?SET IDENTITY_INSERT xyz ON的範圍是什麼?

如果我在某個表的某個存儲過程中使用它,如果運行不同過程的不同用戶同時插入到某個表中,會發生什麼情況?

另外,如果不同的用戶/程序試圖同時爲不同的表設置SET IDENTITY_INSERT xyz ON 會發生什麼?

+0

不管做什麼,我都會非常謹慎。 Set_identity insert on只應該很少完成,偶爾導入的數據從另一個必須保留其身份的系統中移動,通常只有當您首次初始化系統時纔會導入數據。在應用程序中使用它是非常糟糕的做法。如果兩個用戶想爲不同的記錄插入相同的值,該怎麼辦?爲什麼身份是自動生成的,並且他們應該保持這種方式,或者你不應該使用它們。 – HLGEM 2011-04-26 14:59:00

+1

@HLGEM,這是恢復功能的一部分,其中刪除的數據被添加回來(從歷史日誌表複製) – RacerX 2011-04-28 12:52:34

回答

11

這是一個會話選項一張桌子一次只能有一個桌子上的選項,但多個不同的會話可以在同一張桌子上(不確定這會是一個好主意,但!)

當一個子批處理完成(設置此選項)時,它看起來像它會自動取消連接。

CREATE TABLE Tst 
(C INT IDENTITY(1,1)) 

EXEC('SET IDENTITY_INSERT Tst ON') 
INSERT INTO Tst(C) VALUES (1) /*Fails - Complains IDENTITY_INSERT is off*/ 

SET IDENTITY_INSERT Tst ON 
EXEC('INSERT INTO Tst(C) VALUES (1)') /*Succeeds this way round*/ 
SET IDENTITY_INSERT Tst OFF 
+0

會話=連接? – RacerX 2011-04-26 14:43:59

+0

@RacerX - 是的,但看到我的評論關於它被重置,當你上調用堆棧。 – 2011-04-26 14:47:31

3

我的測試(SQL 2008 R2)顯示,列上的身份仍然規格捧出來的正確的價值觀在一個會話,即使該表具有另一個會話IDENTITY_INSERT ON

您應該能夠在一個會話(具有IDENTITY_INSERT ON)中將數據批量插入具有特定標識列值的表中,而另一個用戶(在另一個會話中)則依賴於標識列才能正常工作。