2009-09-08 6 views
0

Je tente de fusionner plusieurs bases de données SQL Server en une seule. Le problème est que l'une des tables a un champ d'identité en tant que clé primaire. La table a également deux champs uniquesid. Quelque chose comme:Fusionner des bases de données SQL Server

datatable: 
id pk identity 
link1 uniqueid 
link2 uniqueid 

Ma première pensée a été pour exécuter le script suivant:

declare @maxId as int 
set @maxId = (SELECT IsNull(MAX(id),0) FROM datatable) 
SET IDENTITY_INSERT datatable ON 
INSERT INTO database1.datatable id, link1, link2 SELECT id + @maxId, link1, link2 FROM database2.datatable 
SET IDENTITY_INSERT datatable OFF 

Ce qui fonctionne, sauf que c'est la requête est exécutée plusieurs fois les données se dupliqués. Quelle serait la meilleure façon de s'assurer qu'une combinaison de link1 et link2 n'existe pas déjà dans ma table?

S'il n'y avait qu'une seule colonne, je pourrais utiliser l'instruction IN, mais malheureusement, j'ai besoin que les deux colonnes correspondent.

Répondre

1

Vous avez mentionné IN, donc je suppose que vous voulez fusionner les colonnes de liens. De cette façon, il est possible de s'exécuter plusieurs fois en toute sécurité et d'éviter le problème de colonne IDENTITY.

INSERT INTO database1.datatable (link1, link2) 
SELECT link1, link2 
FROM database2.datatable d2 
WHERE NOT EXISTS (SELECT * 
    FROM 
     database1.datatable d1 
    WHERE 
     d1.link1 = d2.link1 and d1.link2 and d2.link2) 

Si c'est mal, vous pouvez toujours utiliser EXISTS/NOT EXISTS pour faire face à plusieurs colonnes qu'une clause IN ne peut pas ...

+0

Exactement les informations que je cherchais. Merci. – Kyle

Questions connexes