2011-04-26 100 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)中将数据批量插入具有特定标识列值的表中,而另一个用户(在另一个会话中)则依赖于标识列才能正常工作。