IDENTITY_INSERT ПРИ неработоспособности — SQL Server 2008 R2

#sql-server-2008-r2 #identity #identity-column

#sql-server-2008-r2 #идентичность #идентификатор-столбец

Вопрос:

У меня проблемы с моим запросом. По сути, то, что я пытаюсь сделать, это очистить таблицу и скопировать записи из той же таблицы в другую базу данных.

Я использовал SET IDENTITY_INSERT код, чтобы убедиться, что столбец identity отключен перед выполнением вставки. Но почему-то он все равно выдает мне сообщение об ошибке:

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

Ниже приведен мой запрос:

 DELETE FROM [DB1].[dbo].[MY_TABLE] 

SET IDENTITY_INSERT [DB1].[dbo].[MY_TABLE] ON

INSERT INTO [DB1].[dbo].[MY_TABLE]
   SELECT *
   FROM  [DB2].[dbo].[MY_TABLE]

SET  IDENTITY_INSERT [DB1].[dbo].[MY_TABLE] OFF
 

Может ли кто-нибудь указать мне, какой шаг я делаю неправильно?

Большое спасибо!

Ответ №1:

Вы должны указать все имена столбцов при вставке с помощью IDENTITY INSERT ON при использовании INSERT INTO

 INSERT INTO  [DB1].[dbo].[MY_TABLE](TabelID,Field1,Field2,Field3...)
SELECT * FROM  [DB2].[dbo].[MY_TABLE]
 

На случай, если вы не знали, в ssms есть изящная маленькая хитрость. Если выбрать таблицу и развернуть ее узлы, вы нажмете ctrl-c копировать в узел Columns, и это поместит список имен полей, разделенных запятыми, в текстовый буфер буфера обмена.

Комментарии:

1. И я бы даже рекомендовал всегда явно перечислять столбцы во всех ваших INSERT SELECT утверждениях И . Это немного сложнее набирать текст заранее, но из-за этого можно избежать множества проблем и ошибок, которые трудно найти!

Ответ №2:

Дополнение к первому ответу, данному Россом Бушем, если в вашей таблице много столбцов, то для получения имени этих столбцов с помощью этой команды.

 SELECT column_name   ','
FROM   information_schema.columns 
WHERE  table_name = 'TableName'
for xml path('')
 

(после удаления последней запятой (‘,’)) Просто скопируйте имя предыдущих столбцов.