Создание дублирующихся записей с внешними ключами автономного номера - PullRequest
3 голосов
/ 16 сентября 2011

(с использованием SS2008) В базе данных сервера SQL я хотел бы скопировать все данные одного клиента для нового клиента. Другими словами, генерировать точные дубликаты всех записей, которые относятся к клиенту № 1, за исключением того, что теперь поле идентификатора клиента новых записей относится к клиенту № 2. Это все внутри одной базы данных.

Обычно я делаю это с помощью серии команд INSERT для соответствующих таблиц, выбирающих записи клиента № 1. Однако некоторые таблицы имеют столбцы идентификаторов автономного номера, и эти идентификаторы упоминаются как внешние ключи в дочерних таблицах. Поэтому при создании записей дочерней таблицы мне нужно знать и ссылаться на вновь созданные идентификаторы автономного номера.

Какой самый чистый способ сделать это? Можно ли это сделать с помощью репликации SQL Server? Мои знания SQL Server довольно умеренные.

1 Ответ

5 голосов
/ 16 сентября 2011

Я бы сделал что-то вроде этого:

-- Set up a placeholder for the new id
DECLARE @NewID INT;

-- INSERT parent record
INSERT INTO myTable (field1, field2)
SELECT field1, field2 FROM myTable WHERE ID = 1

-- Get the new ID
SET @NewID = (SELECT SCOPE_IDENTITY());

-- Insert child records with new id 
INSERT INTO OtherTable (fkid, field1, field2)
SELECT @NewID, field1, field2 FROM OtherTable WHERE ID = 1

Теперь, если нам нужно разобраться с тысячами записей, это может сработать:

-- Add a new column in the database to manage where the record came from
ALTER TABLE myTable ADD ParentID int NULL

-- INSERT parent record
INSERT INTO myTable (field1, field2, ParentID)
SELECT 
    field1
    , field2
    , ID 
FROM myTable 
WHERE SomeCondition IS True

-- Insert child records with new id 
INSERT INTO OtherTable (fkid, field1, field2)
SELECT 
    myTable.ID
    , OtherTable.field1
    , OtherTable.field2 
FROM 
    OtherTable 
    INNER JOIN myTable ON OtherTable.FKID = myTable.ParentID

-- Once unneeded, drop the temporary column
-- ALTER TABLE myTable DROP COLUMN ParentID
...