的范围是什么?SET IDENTITY_INSERT xyz ON
?
如果我在某个表的存储过程中使用这个功能,如果不同的用户运行不同的存储过程,同时插入该表,会发生什么?
另外,如果不同的用户存储过程尝试设置了 SET IDENTITY_INSERT xyz ON
同时对不同的表进行操作?
这是一个会话选项,一个表一次只能为任何一个表打开这个选项,但是多个不同的会话可以为同一个表打开这个选项(虽然不确定这是否是一个好主意!)。
当一个子批处理完成时(设置了这个选项),它看起来就像自动为连接取消设置。
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
SET IDENTITY_INSERT Tst ON
EXEC('SET IDENTITY_INSERT Tst ON; INSERT INTO Tst(C) VALUES (1);') /* Also succeeds like this*/
我的测试(SQL 2008 R2)显示,在一个会话中,列上的身份规范仍然会发出正确的值,即使表有 IDENTITY_INSERT ON
在另一个会话中插入数据。
你应该能够在一个会话中,用特定的身份列值批量插入数据到表中(用 IDENTITY_INSERT ON
),而另一个用户(在另一个会话中)则依靠身份列正常运行。