Eu tenho tabelas Listings
e Media
que é uma tabela filha Listings
e vinculada com base ListingId
no banco de dados "origem" e tenho as mesmas tabelas no banco de dados "destino".
copie todas as listagens para a tabela de destino Listagens e seus filhos para Media
a tabela de destino lembrando que a Media
tabela de destino tem que pegar o ListingId
que foi inserido na Listings
tabela de destino e isso é umidentity column
INSERT INTO Listings ( Title, ...)
SELECT Title..
FROM [source].[dbo].Listings
WHERE ListingId IN (
SELECT s.ListingId
FROM [source].[dbo].Listings s
LEFT JOIN Listings d ON s.ImportedReferenceNumber = d.ImportedReferenceNumber
WHERE d.ListingId IS NULL
);
-- Insert corresponding media records into destination.Media table with new ListingIds.
INSERT INTO Media ( ListingId, Url, ThumbnailUrl, TypeId)
SELECT New.ListingID, Url, ThumbnailUrl, TypeId
FROM [source].[dbo].Media m
INNER JOIN (
SELECT s.ListingId, d.ListingId AS NEW_ListingId
FROM [source].[dbo].Listings s
LEFT JOIN Listings d ON s.ImportedReferenceNumber = d.ImportedReferenceNumber
WHERE d.ListingId IS NULL
) AS NEW ON m.ListingId = NEW.ListingId;
A primeira parte funciona bem, mas nada é inserido no destino Media
porque a consulta que tenho quando executada, não há diferença entre a Listings
tabela de origem e destino
Isso pode ser feito com um loop simples e SCOPE_IDENTITY(), mas dependendo do tamanho do seu conjunto de dados, pode ser executado por algum tempo.
Além disso, para qualquer esperança desse acabamento, você precisa ter um índice não clusterizado em Media.ListingId.
Isso funciona inserindo registros da tabela Listings de origem na tabela Listings de destino, um por um, usando SCOPE_IDENTITY() para capturar o valor de identidade do registro recém-inserido na variável @ListingID_New e, em seguida, inserindo na tabela Media filha SOMENTE registros da tabela Media original que tem um ListingId que corresponde ao ListingId que acabou de ser inserido na tabela Listings de destino e definindo o ListingID para a tabela Media de destino usando o valor @ListingID_New.