首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在SQL Server中将IDENTITY_INSERT设置为ON或OFF?

如何在SQL Server中将IDENTITY_INSERT设置为ON或OFF?
EN

Stack Overflow用户
提问于 2012-05-17 22:45:03
回答 6查看 108.5K关注 0票数 82

我已经搜索过这个问题,但它出现的帖子往往有来自不理解这个问题的人的答案。

采用以下语法:

代码语言:javascript
复制
SET IDENTITY_INSERT Table1 ON

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

代码语言:javascript
复制
GET IDENTITY_INSERT Table1

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

EN

回答 6

Stack Overflow用户

发布于 2017-12-08 01:51:37

您可以使用下面的代码来发现identity_insert是否打开,如果是,则查看哪个表。

代码语言:javascript
复制
declare @tableWithIdentity varchar(max) = '';
SET IDENTITY_INSERT ExampleTable ON

begin try
  create table #identityCheck (id int identity(1,1))
  SET IDENTITY_INSERT #identityCheck ON
  drop table #identityCheck
end try
begin catch
  declare @msg varchar(max) = error_message()
  set @tableWithIdentity= @msg;
  set @tableWithIdentity = 
  SUBSTRING(@tableWithIdentity,charindex('''',@tableWithIdentity,1)+1, 10000)

  set @tableWithIdentity = SUBSTRING(@tableWithIdentity,1, charindex('''',@tableWithIdentity,1)-1)

  print @msg;
  drop table #identityCheck
end catch

if @tableWithIdentity<>''
begin
  print ('Name of table with Identity_Insert set to ON: ' + @tableWithIdentity)
end
else
begin
  print 'No table currently has Identity Insert Set to ON'
end 
票数 9
EN

Stack Overflow用户

发布于 2014-06-04 02:07:33

如果您正在尝试关闭其他表的IDENTITY_INSERT,以避免在您想要将IDENTITY_INSERT设置为on时出现错误,则以下方法也可能适用于您。正如其他人在这个帖子上所说的,IDENTITY_INSERT是一个没有直接可见性的会话设置。但是,我发现了一个有趣的现象,即对于任何具有标识的表,无论IDENTITY_INSERT对该表是否启用,将IDENTITY_INSERT设置为OFF都不会出错。所以我想我可以直接调用SET IDENTITY_INSERT ..。对于数据库中具有标识的每个表都为OFF。这感觉有点像暴力解决方案,但我发现下面的动态SQL块做得非常好。

代码语言:javascript
复制
---- 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
票数 6
EN

Stack Overflow用户

发布于 2013-11-11 22:31:34

问得好。我也有同样的问题。也许你可以尝试使用TRY/CATCH重置IDENTITY_INSERT?例如,您创建了作业,但不确定作业是否已完成且IDENTITY_INSERT设置为OFF。

你为什么不试一试:

代码语言:javascript
复制
BEGIN TRY 
...
END TRY 
BEGIN CATCH
SET IDENTITY_INSERT table OFF;
END CATCH;

此外,我不确定这是否正常工作,但我看到只添加SET IDENTITY_INSERT ... OFF并没有返回错误。所以你可以在最后的SET IDENTITY_INSERT ... OFF中进行设置,以防万一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10637976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档