Question

Je suis en train de comparer les données de deux systèmes. L'idée de base est:

  • Créer une table Temp.
  • Insérer des données Table1.
  • insérer des données (Tableau 2 Prix moyens un lien, le serveur distant) avec UNIQUE Ids respecté.
  • Filtre où la première ou deuxième table comporte des informations différentes.

Je suis en train d'obtenir la deuxième série d'inserts, du second système, d'insérer, et si double, mise à jour à la place. Je ne peux pas sembler pour obtenir ce droit. Pour l'insert final, que dois-je faire?

Je n'ai pas le « filtre partie » parce que je n'ai pas les données insérées Table2. La partie filtre montrerait les lignes où active, nom ou prénom est différent entre les deux systèmes. déclarations de type simple where Table1LastName <> Table2LastName.

Note: J'ai ce travail avec 2 tables temporaires créés ... et une jointure externe complète et certains « Où ID est nul ». Je suis juste essayer d'obtenir que cela fonctionne d'une manière que je ne l'ai pas utilisé auparavant.

if object_id('tempdb..#CompareDrs') is not null
    drop table #CompareDrs;
GO

create table #CompareDrs
(
     ID varchar(20) unique
    ,TABLE1Active varchar(1)
    ,TABLE1LastName varchar(50)
    ,TABLE1FirstName varchar(50)
    ,TABLE2Active varchar(1)
    ,TABLE2LastName varchar(50)
    ,TABLE2FirstName varchar(50)
);
GO

INSERT INTO #CompareDrs (ID, TABLE1Active, TABLE1LastName, TABLE1FirstName)
    SELECT
         right('00000000000000000000' + ForeignID, 20) ID
        ,case when Active = 0 then 'I'
              when Active = 1 then 'A'
              else ' '
         end       TABLE1Active
        ,LastName  TABLE1LastName
        ,FirstName TABLE1FirstName
    FROM
                  [DATABASE1].dbo.DRs
    Order By
        ID;
GO

INSERT Into #CompareDrs (ID, TABLE2Active, TABLE2LastName, TABLE2FirstName)
    SELECT 
         right('00000000000000000000' + Cast(DRDR# as Varchar(50)), 20) ID
        ,DRAFLG TABLE2Active
        ,DRLNAM TABLE2LastName
        ,DR1NAM TABLE2FirstName
    FROM
        [LINKEDERVER].[DATABASE].[CATALOG].[TABLE] DR
ON DUPLICATE KEY UPDATE TABLE2Active = VALUES(TABLE2Active), 
                        TABLE2LastName = VALUES(TABLE2LastName), 
                        TABLE2FirstName = VALUES(TABLE2FirstName),
GO

SELECT * FROM #CompareDrs;
Était-ce utile?

La solution

Si vous utilisez SQL Server 2008, consultez le MERGE déclaration, il peut faire ce que les autres plates-formes appellent UPSERT, UPDATE si elle existe, sinon INSERT.

Autres conseils

Vous pourriez écrire une instruction SELECT qui capture les années id qui ont été insérées de la première insertion dans la table temporaire.

Ensuite il suffit d'insérer de la 2ème table, sauf si id est containted dans votre déclaration précédente SELET. Utilisez une ELSE pour mettre en œuvre les autres lignes comme UPDATE

On dirait que vous mettez les lignes de correspondance de deux tables en une seule rangée dans une autre table.

Si tel est le cas, alors vous devez

  • colonnes INSERT de la première table, et
  • Mise à jour d'autres colonnes de la deuxième table où les numéros d'identification correspondent et où les autres colonnes sont NULL.

Je peux me tromper à ce sujet, parce qu'il est pas tout à fait clair pour moi que les numéros d'identification sur les deux tables vont correspondre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top