Подтвердить что ты не робот

Как вы проверяете, установлено ли IDENTITY_INSERT в ON или OFF на SQL Server?

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

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

SET IDENTITY_INSERT Table1 ON

Как вы делаете что-то большее:

GET IDENTITY_INSERT Table1

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

4b9b3361

Ответ 1

Так как SET IDENTITY_INSERT является чувствительным к сеансу, он управляется на уровне буфера без сохранения где-то. Это означает, что нам не нужно проверять статус IDENTITY_INSERT, поскольку мы никогда не используем это ключевое слово в текущем сеансе.

Извините, никакой помощи для этого.

Отличный вопрос:)

Источник: Здесь

Обновление Возможно, есть способы сделать это, также увиденное на сайте, с которым я связан, ИМО, слишком много усилий для того, чтобы быть полезным.

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

Ответ 2

В итоге:

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

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

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

    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';

Ответ 3

Вы можете узнать, включен ли идентификатор_интеста, и если да, то для какой таблицы используется код ниже.

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 

Ответ 4

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

Ответ 5

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

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

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

Удачи!

Ответ 6

Очень хороший вопрос. У меня такая же проблема. Может быть, вы можете попробовать reset 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.

Ответ 7

вы также можете использовать метод 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