Как проверить, установлен ли параметр Identity INSERT в SQL Server в положение ON или OFF?

Я искал это, но темы, в которых он появился, имели тенденцию иметь ответы от людей, которые не понимали вопрос.

Возьмите следующий синтаксис:

SET IDENTITY_INSERT Table1 ON

Как вы делаете что-то вроде этого:

GET IDENTITY_INSERT Table1

Я не хочу ничего делать с данными в базе данных или с настройками, чтобы получить эту информацию. Спасибо!

7 ответов


С SET IDENTITY_INSERT чувствителен к сеансу, он управляется на уровне буфера без сохранения где-либо. Это означает, что нам не нужно проверять 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

в итоге:

  • решение Натана является самым быстрым:

    SELECT OBJECTPROPERTY(OBJECT_ID('MyTable'), 'TableHasIdentity');
    
    • при использовании оболочки API можно уменьшить всю проверку, просто проверяя строки. Например, при использовании C#'ы SqlDataReaders свойства HasRows и конструкция запроса типа:

      SELECT CASE OBJECTPROPERTY(OBJECT_ID('MyTable'), 'TableHasIdentity')
             WHEN 1 THEN '1' ELSE NULL END
      
  • решение Рикардо позволяет больше гибкости, но требует идентичности столбца имя

    SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('MyTable', 'U') 
                            AND name = 'MyTableIdentityColumnName';
    
  • решение Богдана Боданова, используя try/catch также будет работать, но дополнительная проверка должна ограничивать обработку исключений случаями IDENTITY_INSERT is already ON for table 'MyTable'. Cannot perform SET operation for table 'MyTable';


Если вы пытаетесь отключить IDENTITY_INSERT для какой-либо другой таблицы, чтобы избежать получения ошибки, когда вы хотите установить IDENTITY_INSERT, следующее также может работать для вас. Как говорили другие в этом потоке IDENTITY_INSERT-это параметр сеанса без прямой видимости. Однако я сделал интересное открытие, что SET IDENTITY_INSERT OFF не ошибается для любой таблицы, которая имеет идентификатор, независимо от того, включен ли IDENTITY_INSERT для этой таблицы. И мне пришло в голову, что я могу просто вызвать set identity_insert установлен ... Для каждой таблицы с идентификатором в базе данных. Это немного похоже на решение грубой силы, но Я обнаружил, что следующий динамический блок 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

Если вы хотите узнать о переменной сеанса... Хороший вопрос, но я не вижу, где эта информация будет полезной. В обычном исполнении, чтобы проверить обычный ответ таблицы на вставку, это должно работать!

-- Если вы только хотите знать, есть ли Identity insert в данной таблице:

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

удачи!


вы можете узнать, включен ли 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 

очень хороший вопрос. У меня такая же проблема. Может быть, вы можете попробовать сбросить IDENTITY_INSERT, используя TRY / CATCH? Например, вы делаете задание, но не уверены, что задание завершено и 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