#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('')
(после удаления последней запятой (‘,’)) Просто скопируйте имя предыдущих столбцов.