Як увімкнути та вимкнути 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.

Розгорніть це питання, щоб ми могли зрозуміти, що ви намагаєтеся зробити. Яке висловлювання запущене, коли ви зіткнулися з цією помилкою, і який власне текст повідомлення про помилку?
Метт Гібсон

Незважаючи на те, що ви задали інше запитання, ви повинні прийняти відповідь тут: ми відповіли, що ви запитали .
gbn

8
У мене жах ідеї про те, що хтось намагається надсилати цінності особи з програми. Це не те, що вам слід робити, крім нечастої міграції даних. Якщо ви робите це досить регулярно, щоб запустити його з програми, тоді вам, ймовірно, потрібно переглянути дизайн таблиці.
HLGEM

Я використовую це в резервній копії сценарію SQL. Під час відновлення дозвольте завантажити дані в таблицю з автоматичним збільшенням з оригінальними значеннями. Сценарій резервного копіювання дозволив мені знизити рівень бази даних SQL. Реалізація резервної копії сценаріїв Studio 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.


@Beginner: ви все-таки помилка. Як нам знати, що ви не хочете вставляти значення? У нас є лише повідомлення про помилку
gbn

3
Помилка в моєму додатку, коли я роблю DB.SaveChanges ();
Початківці

5
Ні, просто припиніть надсилати значення для стовпця особи. Або встановіть його, якщо ви хочете у своєму додатку, якщо ви хочете надіслати значення ..... але тоді навіщо мати стовпець із властивістю ідентичності для створення значень? Ми не можемо вирішити для вас
gbn

22
@Beginner: Налаштування застосовується лише в поточному сеансі (ніхто не вказував на це питання), тому ваша програма повинна ввімкнути її для того, щоб програма могла виконати такі вставки (і, мабуть, найкраще негайно ввімкнути він знову вимикається, коли такі вставки укладені, як gbn). Як ви вставляли значення в стовпчик ідентичності, не усвідомлюючи це, не зрозуміло, але, можливо, старіші версії SQL Server включали б це неявно з усіма стовпцями, коли явні стовпчики вставок не вказані (?), Як видається, що пропонує Ісмаел.
Роб Паркер

2
@Rob, я думаю, у вас є точка adn, я особисто не вдається переглядати код будь-якого коду, який можна вставити, не вказуючи стовпці. Окрім часу, який було витрачено на помилку, це ризикована практика, і ви можете зіткнутися з серйозними проблемами з цілісністю даних, якщо дані стовпців не співпадають правильно.
HLGEM

59

У мене виникла проблема, коли вона не дозволила мені вставити її навіть після встановлення IDENTITY_INSERT ON.

Проблема полягала в тому, що я не вказав назви стовпців і чомусь це не сподобалось.

INSERT INTO tbl Values(vals)

Тому в основному виконайте повну ВСТАВЛЕННЯ INTO tbl (cols) Значення (vals)


6
не задайте запитання на панелі відповідей.
Duk

4
це саме те, що я хотів від мене, щоб вказати список стовпців (обидва стовпчики на столі, бла)
Маслоу

36

Імпорт: Ви повинні писати стовпці у INSERTвиписці

INSERT INTO TABLE
SELECT * FROM    

Невірно.

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

Правильно


2
Дякую, що було дуже корисно
Жозе Ромеро

1
Якщо ви маєте однакові стовпці в обох таблицях, ви можете обійтися без перерахування стовпців у виділеному (Поле1 ..), як це .... Вставте у таблицю (Поле1, ...) Виберіть * з ТАБЛИЦІ ... та якщо у вас є Поле посвідчення, яке потрібно вставити спочатку робити ** 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


0

Здається, потрібно поставити SET IDENTITY_INSERT Database.dbo.Baskets ON;перед кожною INSERTпартією відправки SQL .

Ви можете надіслати кілька INSERT ... VALUES ...команд, розпочатих однією SET IDENTITY_INSERT ... ON;струною на початку. Просто не ставте між собою розділовий пакет.

Я не знаю, чому SET IDENTITY_INSERT ... ONприпиняє роботу після блоку відправки (напр .: .ExecuteNonQuery()в C #). Мені довелося поставити SET IDENTITY_INSERT ... ON;знову на початку наступного командного рядка SQL.


може бути , це відповідь на ваше запитання: stackoverflow.com/questions/5791941 / ...
Дімітріс Leptos

-1

Вам потрібно додати команду 'go' після встановлення ідентичності вставки. Приклад:

SET IDENTITY_INSERT sometableWithIdentity ON
go

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

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
Це питання чотири роки і має прийняту відповідь. Ваша відповідь дублює прийняту відповідь
Ghost

13
Ну, не точне дублювання - він таки включав команди "go" ...;)
RoastBeast
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.