我已经搜索过这个问题,但它出现的帖子往往有来自不理解这个问题的人的答案。
采用以下语法:
SET IDENTITY_INSERT Table1 ON
你怎么做更像这样的事情:
GET IDENTITY_INSERT Table1
我不想对数据库中的数据或设置做任何事情来获取这些信息。谢谢!
发布于 2017-12-08 01:51:37
您可以使用下面的代码来发现identity_insert是否打开,如果是,则查看哪个表。
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
发布于 2014-06-04 02:07:33
如果您正在尝试关闭其他表的IDENTITY_INSERT,以避免在您想要将IDENTITY_INSERT设置为on时出现错误,则以下方法也可能适用于您。正如其他人在这个帖子上所说的,IDENTITY_INSERT是一个没有直接可见性的会话设置。但是,我发现了一个有趣的现象,即对于任何具有标识的表,无论IDENTITY_INSERT对该表是否启用,将IDENTITY_INSERT设置为OFF都不会出错。所以我想我可以直接调用SET IDENTITY_INSERT ..。对于数据库中具有标识的每个表都为OFF。这感觉有点像暴力解决方案,但我发现下面的动态SQL块做得非常好。
---- 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
发布于 2013-11-11 22:31:34
问得好。我也有同样的问题。也许你可以尝试使用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
中进行设置,以防万一。
https://stackoverflow.com/questions/10637976
复制相似问题