Я не знаю ни одного нативного метода, но мой общий подход при работе с такими ситуациями (если я правильно понимаю ваш вопрос - клонировать данные, которые будут иметь 2 таблицы, соединенные внешним ключом для второй таблицы, которая происходит с быть столбцом идентичности в первой таблице), выглядит следующим образом:
ПРИМЕЧАНИЕ: это ТОЛЬКО работает, если первая таблица (та, в которой столбец идентификаторов служит внешним ключом, ТАКЖЕ имеет уникальный набор столбцов, который не является столбцом идентификаторов). Это называется " естественный ключ " (hat / tip @rd_nielsen). Надеюсь, у вас уже есть один в форме уникального индекса в первой таблице, который не является уникальным ключом.
Пример: таблица «t1» имеет столбцы id1, c1, c2, c3, c4
, а таблица «t2» имеет id2, id1, d1, d2, d3
, где id1 - столбец идентификаторов в t1 и внешний ключ в t2; и c1 + c2 является естественным ключом в t1.
Этот метод основан на создании временной таблицы переходов, которая заменяет внешний ключ во второй таблице на естественный ключ первой таблицы вместо столбца идентификации первой таблицы.
Найти уникальную комбинацию столбцов (c1+c2
в этом примере) в первой таблице, которая является естественным ключом.
Выполнить запрос соединения, который объединяет столбцы естественного ключа первой таблицы со второй таблицей; через внешний ключ; во временную таблицу.
-- Sybase syntax.
SELECT t1.c1, t1.c2, t2.d1, t2.d2, t2.d3
INTO tempdb..t2_lookupable
WHERE t1.id1 = t2.id1
-- While at it, let's build the migratable columns (everything except identity) for t1
SELECT t1.c1, t1.c2, t1.c3, t1.c4
INTO tempdb..t1_lookupable
При необходимости клонируйте данные из таблиц tempdb..t1_lookupable и tempdb..t2_lookupable в цель.
Это может включать в себя объединение данных из ваших двух баз данных или чего-либо еще, что необходимо сделать. Может быть bcp out / in, может быть какой-то другой метод - зависит от того, что вы делаете.
Заполнение новой таблицы t1 из данных в tempdb..t1_lookupable для цели
-- Could be a BCP
SELECT c1, c2, c3, c4 -- id1 will get autopopulated, being an identity column
FROM tempdb..t1_lookupable
Теперь самая сложная часть - заполнить новую таблицу t2 из комбинации новой таблицы t1 и таблицы t2_lookupable, найдя правильное новое значение "id1", соединив эти 2 таблицы в наборе уникальных ключей c1, c2 :
SELECT t1.id1, t2t.d1, t2t.d2, t2t.d3
INTO
FROM t1, tempdb..t2_lookupable t2t
WHERE t1.c1 = t2t.c1
AND t1.c1 = t2t.c2