如何检查SQL Server中IDENTITY_INSERT是否设置为ON或OFF?

我已经find了这个问题,但是出现的线索往往会从不理解问题的人那里得到答案。

采取以下语法:

SET IDENTITY_INSERT Table1 ON 

你怎么做更像这样的事情:

 GET IDENTITY_INSERT Table1 

我不想对数据库中的数据或设置做任何事情来获取这些信息。 谢谢!

由于SET IDENTITY_INSERT是会话敏感的,因此它在缓冲级别进行pipe理而不存储在某个地方。 这意味着我们不需要检查IDENTITY_INSERT状态,因为我们从来没有在当前会话中使用这个关键字。

对不起,没有帮助。

很好的问题虽然:)

来源: 这里

更新有办法可能做到这一点,也可以在我链接的网站IMO看到,这是太多的努力是有用的。

 if (select max(id) from MyTable) < (select max(id) from inserted) --Then you may be inserting a record normally BEGIN set @I = 1 --SQL wants something to happen in the "IF" side of an IF/ELSE END ELSE --You definitely have IDENTITY_INSERT on. Done as ELSE instead of the other way around so that if there is no inserted table, it will run anyway BEGIN .... Code that shouldn't run with IDENTITY_INSERT on END 

综上所述:

  • Nathan的解决scheme是最快的:

     SELECT OBJECTPROPERTY(OBJECT_ID('MyTable'), 'TableHasIdentity'); 
    • 当使用API​​封装器时,可以减less整个检查来检查行。 例如,当使用C#的SqlDataReaders属性HasRows和一个查询结构如:

       SELECT CASE OBJECTPROPERTY(OBJECT_ID('MyTable'), 'TableHasIdentity') WHEN 1 THEN '1' ELSE NULL END 
  • 里卡多的解决scheme允许更多的灵活性,但需要列的身份名称

     SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('MyTable', 'U') AND name = 'MyTableIdentityColumnName'; 
  • Bogdan Bodanov解决scheme,使用try / catch也可以,但是额外的检查应该限制exception处理情况IDENTITY_INSERT is already ON for table 'MyTable'. Cannot perform SET operation for table 'MyTable'; IDENTITY_INSERT is already ON for table 'MyTable'. Cannot perform SET operation for table 'MyTable';

如果您试图closures某个其他表的IDENTITY_INSERT以避免在设置IDENTITY_INSERT时出现错误,则以下内容也适用于您。 正如其他人所说的这个线程IDENTITY_INSERT是一个没有直接的可见性会话设置。 但是,我做了一个有趣的发现:SET IDENTITY_INSERT OFF不会错误地为任何具有IDENTITY_INSERT为该表的标识的表。 所以在我看来,我可以调用SET IDENTITY_INSERT … OFF在数据库中的每个具有身份的表。 这感觉有点像一个蛮力解决scheme,但我发现下面的dynamicSQL块很好地做了这个技巧。

 ---- make sure IDENTITY_INSERT is OFF ---- DECLARE @cmd NVARCHAR(MAX) SET @cmd = CAST((SELECT 'SET IDENTITY_INSERT ' + QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(t.name) + ' OFF' + CHAR(10) FROM sys.columns c JOIN sys.tables t ON t.object_id = c.object_id WHERE c.is_identity = 1 ORDER BY 1 FOR XML PATH('')) AS NVARCHAR(MAX)) EXEC sp_executesql @cmd 

如果你想知道会话variables…好问题,但我不能看到这个信息将是有用的。 在正常执行检查一个插入的正常表响应,这应该工作!

– 如果您只想知道在给定的表上是否存在标识插入:

 select is_identity from sys.columns where object_id = OBJECT_ID('MyTable', 'U') and name = 'column_Name' 

– 或者…如果你想根据结果执行某些操作,请使用此选项:

 if exists (select * from sys.columns where object_id = OBJECT_ID('MyTable', 'U') and is_identity = 1) ... your code considering identity insert else ... code that should not run with identity insert 

玩的开心!

很好的问题。 我有同样的问题。 可能你可以尝试使用TRY / CATCH重置IDENTITY_INSERT? 例如,您做这项工作,但不知道工作是否完成,IDENTITY_INSERT设置为OFF。

为什么你不尝试:

 BEGIN TRY ... END TRY BEGIN CATCH SET IDENTITY_INSERT table OFF; END CATCH; 

此外,我不知道这是正常工作,但我看到只添加SET IDENTITY_INSERT ... OFF没有返回错误。 所以你可以设置,以防万一到底SET IDENTITY_INSERT ... OFF

您还可以使用ObjectProperty方法来确定表是否具有标识:

 DECLARE @MyTableName nvarchar(200) SET @MyTableName = 'TestTable' SELECT CASE OBJECTPROPERTY(OBJECT_ID(@MyTableName), 'TableHasIdentity') WHEN 1 THEN 'has identity' ELSE 'no identity columns' END as HasIdentity 
Interesting Posts