6

Как включить и выключить IDENTITY_INSERT в SQL Server 2008?

1

Описание проблемы

Почему я получаю ошибку при выполнении операции вставки, когда параметр IDENTITY_INSERT установлен в OFF?

Как правильно включить этот параметр в SQL Server 2008? Делается ли это с помощью SQL Server Management Studio?

Я выполнил следующий запрос:

SET IDENTITY_INSERT Database.dbo.Baskets ON

После этого в консоли я получил сообщение о том, что команда выполнена успешно. Однако, когда я запускаю приложение, ошибка по-прежнему появляется:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

Как я могу решить эту проблему?

5 ответ(ов)

0

Импорт: Вы должны указать названия столбцов в операторе INSERT.

INSERT INTO TABLE
SELECT * FROM    

Недопустимо.

INSERT INTO Table(Field1, ...)
SELECT Field1, ... FROM TABLE

Допустимо.

0

Проблема, с которой я столкнулся, заключалась в том, что у меня не получалось выполнить вставку, даже несмотря на то, что я включил IDENTITY_INSERT ON.

Оказалось, что я не указал имена столбцов, и по какой-то причине это вызвало ошибку.

Вместо этого я использовал такой запрос:

INSERT INTO tbl Values(vals)

В итоге, правильный подход — использовать полный синтаксис: INSERT INTO tbl (cols) VALUES (vals).

0

Я знаю, что это старая тема, но только что с ней столкнулся. Если пользователь пытается выполнить вставки по столбцу Identity после того, как в другой сессии установлено SET IDENTITY_INSERT ON, то он неизбежно получит вышеуказанную ошибку.

Установка значения IDENTITY_INSERT и последующие команды вставки DML должны выполняться в одной и той же сессии.

В данном случае @Beginner сначала включил IDENTITY_INSERT ON отдельно, а затем выполнил вставки из своего приложения. Именно поэтому он получил следующую ошибку:

Невозможно вставить явное значение для столбца identity в таблице 'Baskets', когда  
IDENTITY_INSERT установлен в OFF.
0

Ваша ситуация связана с особенностями работы команды SET IDENTITY_INSERT. Действительно, вам нужно включить SET IDENTITY_INSERT Database.dbo.Baskets ON; перед каждой партией SQL-команд INSERT.

Вы можете отправить несколько команд INSERT ... VALUES ..., предварив их одной строкой SET IDENTITY_INSERT ... ON;, при этом важно не добавлять никакие разделители между запросами в одной партии.

Что касается того, почему команда SET IDENTITY_INSERT ... ON перестает действовать после выполнения блока (.ExecuteNonQuery() в C#), это связано с тем, что каждая партия SQL обрабатывается отдельно, и настройки контекста, такие как IDENTITY_INSERT, не сохраняются между партиями. Поэтому вам необходимо снова задать SET IDENTITY_INSERT ... ON; в начале следующей строки SQL-команды.

Если у вас есть другие вопросы, не стесняйтесь спрашивать!

0

Судя по всему, проблема возникает, когда у вас есть поле PRIMARY KEY, и вы пытаетесь вставить значение, которое уже существует в этой колонке. Также это может происходить, если флаг INSERT_IDENTITY установлен в состояние "включен". Убедитесь, что значение для первичного ключа уникально перед вставкой или отключите флаг, если это возможно в вашем случае.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь