вставка идентификатора tsql без списка имен столбцов - PullRequest
5 голосов
/ 27 июля 2010

Я собираюсь сбросить некоторые данные из одной базы данных в другую.Я использую

set identity_insert MyTable on
GO
INSERT INTO MyTable SELECT * FROM sourceDB.dbo.MyTable
GO
set identity_insert MyTable off

В любом случае, чтобы заставить это работать?Существует 30 таблиц, и добавление списка имен столбцов в оператор вставки займет много времени.Я использую SQL Server 2000. Будет обновлен до SQL Server 2008 в ближайшем будущем.

РЕДАКТИРОВАТЬ: MyTable имеет столбец идентификации.

Ответы [ 4 ]

5 голосов
/ 28 июля 2010

Просто перетащите имена столбцов из браузера объектов.Вы можете сделать это за один шаг, это займет на 1 секунду больше времени, чем написание select *, и вы никогда не должны использовать select * в рабочем коде.Это плохая практика.

Я обеспокоен тем, что вы вставляете столбцы идентификаторов, хотя это почти никогда не следует делать.Что если в исходной таблице есть несколько столбцов идентификаторов, которые совпадают с выходными идентификаторами в новой таблице?Убедитесь, что проверили это прежде, чем решите вставить значения id из другой таблицы.Я предпочитаю выполнить вставку в родительскую таблицу, получить новый идентификатор и сопоставить его со старым идентификатором (вывод подходит для этого в 2008 году), а затем использовать новый идентификатор для любых дочерних таблиц, но присоединиться к старому идентификатору.

3 голосов
/ 27 июля 2010

Только что попробовав этот сценарий на компьютере с SQL Server 2000 с пакетом обновления 2 (SP2), я получаю эту ошибку и, похоже, подтверждаю ваши наблюдения.

Явное значение для столбца идентификации в таблице 'Foo2' можетуказывается только при использовании списка столбцов и включенном параметре IDENTITY_INSERT.

set identity_insert Foo2 on
GO
INSERT INTO Foo2 select top 100 * from Foo where id > 110000
GO
set identity_insert Foo2 off

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

Подсказка к именам столбцов: Выделите таблицу в запросе SSMS и нажмите Alt-F1 (ярлык для sp_help).Затем вы можете скопировать / вставить полученный column_name в ваш запрос и просто добавить запятые от руки.Сделайте еще один шаг по ярлыкам и вставьте их в Excel, введите одну запятую и скопируйте столбцы.

1 голос
/ 07 декабря 2018

HLGEM ответ непрактичен для многих таблиц.Я нахожусь в ситуации, когда мы запускаем скрипт, который время от времени запускаем, чтобы очистить dev и протестировать базы данных, что выкрикнуло одного из разработчиков.По-видимому, в настоящее время есть 22 таблицы, которые не должны быть включены в этот процесс очистки.Хорошо, что у меня была резервная копия.Я поместил имена таблиц в чистую таблицу с именем "undo" и использовал следующие строки для генерации списков столбцов:

select outside.TABLE_NAME,
       stuff((select ',' + COLUMN_NAME
                from INFORMATION_SCHEMA.COLUMNS as inside
               where inside.TABLE_NAME = outside.TABLE_NAME
               order by ORDINAL_POSITION
                 for xml path('')), 1, 1, '') as column_list
  from INFORMATION_SCHEMA.COLUMNS as outside
 where TABLE_NAME in (select table_name from dbo.undo)
 group by TABLE_NAME

Затем я скопировал вывод в Excel и использовал функцию ye olde = CONCATENATE, чтобы сгенерировать все IDENTITY_INSERT.и вставьте операторы INTO, скопируйте / вставьте обратно в SSMS и вуаля!Да, Excel твой друг.

0 голосов
/ 27 июля 2010

Если вам не нужно сохранять значения столбца ID, вы можете:

Удалите столбец идентификатора

Создать столбец идентификатора в новой схеме в новой целевой БД (сделать его последним в списке столбцов)

INSERT INTO newdb.dbo.newtable
SELECT * FROM olddb.dbo.oldtable

И он сохранит остальные ваши столбцы при генерации новой идентификационной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...