Как включить и выключить IDENTITY_INSERT в SQL Server 2008?
Описание проблемы
Почему я получаю ошибку при выполнении операции вставки, когда параметр 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 ответ(ов)
Импорт:
Вы должны указать названия столбцов в операторе INSERT
.
INSERT INTO TABLE
SELECT * FROM
Недопустимо.
INSERT INTO Table(Field1, ...)
SELECT Field1, ... FROM TABLE
Допустимо.
Проблема, с которой я столкнулся, заключалась в том, что у меня не получалось выполнить вставку, даже несмотря на то, что я включил IDENTITY_INSERT ON
.
Оказалось, что я не указал имена столбцов, и по какой-то причине это вызвало ошибку.
Вместо этого я использовал такой запрос:
INSERT INTO tbl Values(vals)
В итоге, правильный подход — использовать полный синтаксис: INSERT INTO tbl (cols) VALUES (vals)
.
Я знаю, что это старая тема, но только что с ней столкнулся. Если пользователь пытается выполнить вставки по столбцу Identity после того, как в другой сессии установлено SET IDENTITY_INSERT ON
, то он неизбежно получит вышеуказанную ошибку.
Установка значения IDENTITY_INSERT
и последующие команды вставки DML должны выполняться в одной и той же сессии.
В данном случае @Beginner сначала включил IDENTITY_INSERT ON
отдельно, а затем выполнил вставки из своего приложения. Именно поэтому он получил следующую ошибку:
Невозможно вставить явное значение для столбца identity в таблице 'Baskets', когда
IDENTITY_INSERT установлен в OFF.
Ваша ситуация связана с особенностями работы команды 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-команды.
Если у вас есть другие вопросы, не стесняйтесь спрашивать!
Судя по всему, проблема возникает, когда у вас есть поле PRIMARY KEY, и вы пытаетесь вставить значение, которое уже существует в этой колонке. Также это может происходить, если флаг INSERT_IDENTITY установлен в состояние "включен". Убедитесь, что значение для первичного ключа уникально перед вставкой или отключите флаг, если это возможно в вашем случае.
Как вернуть только дату из типа данных DateTime в SQL Server
Как удалить с использованием INNER JOIN в SQL Server?
Сброс начального значения идентификатора после удаления записей в SQL Server
Переименование столбца в SQL Server 2008
Как вывести список таблиц в файле базы данных SQLite, открытом с помощью ATTACH?