SET IDENTITY_INSERT xyz ON
的范围是什么?
如果我在某个表的某个存储过程中使用它,如果运行不同过程的其他用户同时插入该表,会发生什么?
此外,如果不同的用户/程序尝试设置SET IDENTITY_INSERT xyz ON
会发生什么
对于不同的表同时?
答案 0 :(得分:13)
这是一个会话选项,一个表一次只能为任何一个表启用选项,但是多个不同的会话可以为同一个表启用它(不确定这将是一个好主意!)
当子批处理完成时(设置此选项),它看起来会自动为连接取消设置。
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
答案 1 :(得分:3)
我的测试(SQL 2008 R2)显示,即使表在另一个会话中有IDENTITY_INSERT ON
,列上的标识规范仍会在一个会话中分发正确的值。
您应该能够在一个会话中使用特定标识列值(使用IDENTITY_INSERT ON
)将数据批量插入到表中,而另一个用户(在另一个会话中)依赖于标识列来正常运行。