Domanda

sto cercando di confrontare i dati di due sistemi. L'idea di base è:

  • Crea Temp tabella.
  • Inserisci Table1 dati.
  • Inserisci dati Table2 (Tabella una collegata, del server remoto) con ID univoci rispettato.
  • Filtro in cui prima o la seconda tabella ha informazioni diverse.

Sto cercando di ottenere la seconda serie di inserti, dal secondo sistema, di inserire, e se duplicato, aggiornamento, invece. Io non riesco a farlo bene. Per l'inserto finale, che cosa devo avere?

Non avere il "Filtro parte", perché non ho i dati inseriti Table2. La parte del filtro mostrerebbe le righe in cui il nome di Active, ultimo o il primo è diverso tra i due sistemi. Tipo semplice where Table1LastName <> Table2LastName dichiarazioni.

Nota: Ho questo lavoro con 2 tabelle temporanee create ... e un full outer join e qualche "Dove ID è nullo". Sto solo cercando di ottenere questo al lavoro in un modo che non ho usato prima.

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;
È stato utile?

Soluzione

Se si utilizza SQL 2008, un'occhiata alla MERGE affermazione, si può fare ciò che altre piattaforme chiamano UPSERT, UPDATE se esiste, altrimenti INSERT.

Altri suggerimenti

Si potrebbe scrivere una dichiarazione SELECT che cattura i di id che sono stati inseriti dal primo inserimento nella tabella temporanea.

Poi è sufficiente inserire dal 2 ° tavolo a meno di id containted nell'istruzione SELET precedente. Utilizzare un ELSE per attuare le altre righe come un aggiornamento

Sembra che si sta mettendo righe corrispondenti da due tabelle in una singola riga in un'altra tabella.

Se questo è il caso, allora avete bisogno di

  • Inserisci colonne della prima tabella, e
  • UPDATE altre colonne della seconda tabella in cui i numeri di identificazione corrispondono e dove le altre colonne sono NULL.

potrei sbagliarmi su questo, perché non è del tutto chiaro per me che i numeri di identificazione sui due tavoli stanno per abbinare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top