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

Установить IDENTITY_INSERT ON не работает

Я хочу скопировать таблицу Equipment из одной базы данных MyDBQA в нашу тестовую базу данных MyDB. В таблице есть столбец идентификатора, который является первичным ключом (int, а не null).

Но у меня есть ошибка:

Msg 8101, уровень 16, состояние 1, строка 2
Явное значение для столбца идентификации в таблице "MyDB.dbo.Equipment" может быть указано только при использовании списка столбцов и IDENTITY_INSERT включен.

Мой script:

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON
INSERT INTO [MyDB].[dbo].[Equipment]  SELECT * FROM [MyDBQA].[dbo].[Equipment]
SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF
4b9b3361

Ответ 1

Возможно, вам просто не хватает списка столбцов, как говорится в сообщении

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON

INSERT INTO [MyDB].[dbo].[Equipment]
            (COL1,
             COL2)
SELECT COL1,
       COL2
FROM   [MyDBQA].[dbo].[Equipment]

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF 

Ответ 2

Соответствующая часть сообщения об ошибке

...when a column list is used...

Вы не используете список столбцов, вы используете SELECT *. Вместо этого используйте список столбцов:

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON 

INSERT INTO [MyDB].[dbo].[Equipment] (Col1, Col2, ...)
SELECT Col1, Col2, ... FROM [MyDBQA].[dbo].[Equipment] 

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF 

Ответ 3

Здесь Microsoft пишет об использовании SET IDENTITY_INSERT, что может быть полезно для других, видящих это сообщение, если они, как и я, нашли это сообщение при попытке воссоздать удаленные записи, сохраняя при этом исходное значение столбца идентификатора.

для воссоздания удаленных записей с исходным значением столбца идентификатора: http://msdn.microsoft.com/en-us/library/aa259221(v=sql.80).aspx

Ответ 4

В коде VB при попытке отправить запрос INSERT вы должны отправить двойной запрос в том же "executenonquery", как это:

sqlQuery = "SET IDENTITY_INSERT dbo.TheTable & " ON; " & "INSERT INTO dbo.TheTable blah, blah...;"

Я использовал разделитель ; вместо GO.

Работает для меня. Поздно, но эффективно!