Как включить и выключить IDENTITY_INSERT с помощью SQL Server 2008?

461

Почему при вставке выдается ошибка при 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.
начинающий
источник
Пожалуйста, расширьте этот вопрос, чтобы мы могли понять, что вы пытаетесь сделать. Какое утверждение вы выполняете, когда вы сталкиваетесь с этой ошибкой, и каков фактический текст сообщения об ошибке?
Мэтт Гибсон
Даже если вы задали другой вопрос, вы должны принять ответ здесь: мы ответили на ваш вопрос .
ГБН
8
У меня ужас от мысли, что кто-то пытается отправить идентификационные значения из приложения. Это не то, что вы должны делать, за исключением редкой миграции данных. Если вы делаете это достаточно регулярно, чтобы запустить его из приложения, то вам, вероятно, нужно пересмотреть дизайн таблицы.
HLGEM
Я использую это в моей резервной копии SQL. Во время восстановления это позволило мне загрузить данные в таблицу с автоинкрементом с исходными значениями. Резервное копирование по сценарию позволило мне понизить версию базы данных SQL. Реализация Scriptted резервного копирования в Management Studio делает не загружаемый скрипт, если я храню двоичные данные в текстовом поле.
Jettero

Ответы:

771

Через SQL согласно MSDN

SET IDENTITY_INSERT sometableWithIdentity ON

INSERT INTO sometableWithIdentity 
    (IdentityColumn, col2, col3, ...)
VALUES 
    (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF

Полное сообщение об ошибке говорит вам , что именно не так ...

Невозможно вставить явное значение для столбца идентификаторов в таблице sometableWithIdentity, если для параметра IDENTITY_INSERT установлено значение OFF.

ГБН
источник
@ Начинающий: вы, хотя, следовательно, ошибка. Откуда нам знать, что вы не хотите вставлять значения? У нас есть только сообщение об ошибке
gbn
3
Ошибка из моего приложения, когда я делаю DB.SaveChanges ();
Новичок
5
Нет, просто прекратите отправку значения для столбца идентификаторов. Или установите его, если вы хотите в своем приложении, если вы хотите отправить значение ..... но тогда зачем устанавливать столбец со свойством identity для генерации значений? Мы не можем решить за вас
gbn
22
@Beginner: настройка применима только в текущем сеансе (никто не указал на это по этому вопросу), поэтому вашему приложению придется включить его, чтобы приложение выполняло такие вставки (и, вероятно, лучше сразу же включить снова, когда такие вставки заканчиваются, как показывает gbn). То, как вы вставляли значение в столбец идентификаторов, не осознавая его, неясно, но, возможно, более старые версии SQL Server включали бы его неявно со всеми столбцами, когда явные столбцы вставки не указаны (?), Как кажется из Исмаила.
Роб Паркер
2
@ Роб, я думаю, у вас есть точка зрения, и я лично провалю проверку кода для любого кода, который вставляется без указания столбцов. Помимо времени, потраченного на ошибку, это рискованная практика, и вы можете столкнуться с серьезными проблемами целостности данных, если данные столбца не совпадают правильно.
HLGEM
59

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

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

INSERT INTO tbl Values(vals)

Таким образом, в основном делают полные значения INSERT INTO tbl (cols) (vals)

Исмаэль
источник
6
не задавайте вопросы на панели ответов.
Дук
4
это было именно то, что он хотел от меня, чтобы указать список столбцов (оба столбца в таблице, бла)
Маслоу
36

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

INSERT INTO TABLE
SELECT * FROM    

Не является правильным.

Insert into Table(Field1,...)
Select (Field1,...) from TABLE

Верно

R.Alonso
источник
2
Спасибо, это было очень полезно
Хосе Ромеро
1
Если у вас есть одинаковые столбцы в обеих таблицах, вы можете обойтись без перечисления столбцов в select (Field1 ..) следующим образом ... Вставить в таблицу (Field1, ...) Выберите * из TABLE ... и если у вас есть Поле идентификатора для вставки сначала выполните ** SET IDENTITY_INSERT Имя_таблицы включено
user3590235
@ user3590235 Это рискованное предположение, что список столбцов идентичен. За исключением ручных пользовательских запросов, никогда не делайте этого, потому что я гарантирую, что вы сломаете PROD однажды, когда кто-то другой изменит определение таблицы, не обновляя вашу ссылку.
Эласканатор
5

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

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

Здесь @Beginner устанавливал Identity Insert ON отдельно и затем запускал вставки из своего приложения. Вот почему он получил следующую ошибку:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.
хорошо
источник
0

Это вероятно, когда у вас есть поле PRIMARY KEY, и вы вставляете дублирующее значение, или у вас установлен флаг INSERT_IDENTITY на

seanyp20001
источник
0

Похоже надо ставить SET IDENTITY_INSERT Database.dbo.Baskets ON;перед каждым SQLINSERT отправкой пакета.

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

Я не знаю, почему SET IDENTITY_INSERT ... ONперестает работать после блока отправки (например, .ExecuteNonQuery()в C #). Мне пришлось SET IDENTITY_INSERT ... ON;снова поставить в начале следующей строки команды SQL.

Jettero
источник
может быть, это отвечает на ваш вопрос: stackoverflow.com/questions/5791941/…
Деметрис
0

Другой вариант - это когда у вас есть таблицы типа 'type' или 'status', например, OrderStatus, где вы всегда хотите контролировать значение Id, создавая столбец Id (первичный ключ), не будучи первым столбцом Identity.

Роберт Брукер
источник
-1

Вам нужно добавить команду 'go' после того, как вы установите идентификационную вставку. Пример:

SET IDENTITY_INSERT sometableWithIdentity ON
go

INSERT sometableWithIdentity (IdentityColumn, col2, col3, ...)
VALUES (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF
go
Брюс
источник
5
Этому вопросу четыре года, и на него есть принятый ответ. Ваш ответ дублирует принятый ответ
Призрак
13
Ну, не точное дублирование - он включил команды "go" ...;)
RoastBeast