2010-06-10 24 views
8

Ho table a e table b. (SQL Server 2008)T-SQL - Esiste un modo (gratuito) per confrontare i dati in due tabelle?

Entrambe le tabelle hanno lo stesso schema.

Per gli scopi di questa domanda, considerare table a = la mia tabella di sviluppo locale, table b = la tabella live.

Devo creare uno script SQL (contenente le istruzioni UPDATE/DELETE/INSERT) che aggiornerà la tabella b in modo che corrisponda alla tabella a. Questo script verrà quindi distribuito nel database live.

Qualsiasi strumento gratuito là fuori che può fare questo, o meglio ancora un modo in cui posso farlo da solo?

Sto pensando che probabilmente ho bisogno di fare un tipo di join su tutti i campi nelle tabelle, quindi generare SQL dinamico basato su quello.

Qualcuno ha qualche idea?

EDIT

Va bene, ho pensato di chiarire questa domanda un po '.

La tabella che devo sincronizzare è una semplice tabella di ricerca. I dati sono molto semplici e diretti.

Ecco un'idea di quello TABLE A potrebbe essere simile:

IdFoo   Activity  IsFoo 
1    Foo   1 
2    Bar   0 

Ecco un'idea di quello TABLE B potrebbe essere simile:

IdFoo   Activity  IsFoo 
1    Foo   1 
2    Bar   1 

In sostanza, tutto quello che voglio fare è di aggiornamento che BIT colonna (IsFoo) in TABLE B per abbinare il valore corrispondente in TABLE A per lo stesso IdFoo.

tenere a mente:

  • TABLE A è sulla mia macchina locale
  • TABLE B è sul server di vivere

Ovviamente ho un backup (affidabile) di TABLE B sulla mia macchina locale che ho bisogno di script contro, quindi eseguire lo script sul server live.

La tabella ha anche integrità referenziale (altre colonne che non ho mostrato). Il che significa che non posso semplicemente cancellare tutto in TABLE B e fare un inserto da TABLE A.

Questo script sarà una volta spento. Quindi non c'è bisogno di fare cose come server collegato, replica, ecc. Apprezzare le risposte, anche se ragazzi. =)

EDIT:

Ok - così sono andato con la risposta di Oleg (VS2010 tecnica Confronta). Veloce, facile e ha un fascino.

Per non dire che le altre risposte non sono corrette. Apprezzo tutte le risposte!

+0

Qualsiasi risposta dipenderebbe molto dal fatto se si dispone di un campo che può essere utilizzato in modo affidabile per abbinare due righe. –

+0

La risposta dipende anche dalla frequenza con cui è necessario eseguire questa operazione e quanto sono grandi i dati? Se si tratta di una cosa una tantum, è sufficiente utilizzare la procedura guidata Importa/Esporta per trasferire la tabella b' in 'table a'. Se si desidera che le modifiche vengano riflesse immediatamente e continuamente, è possibile implementare la replica. – codingbadger

risposta

5

In casi molto semplici, sarà possibile definire nel server SQL locale un nuovo server collegato (vedere in Microsoft SQL Server Management Studio in "Oggetti server"/"Server collegato") e utilizzare INNER JOIN e OUTER JOIN per scoprirlo differenze tra le tabelle A e B.

In una situazione reale e più complessa, è necessario prendere in considerazione i campi Integrità referenziale, chiavi esterne e Identità (auto incrementali) esistenti nel database di destinazione, pertanto lo script di aggiornamento sarà più complesso. Quindi ti raccomando di non perdere tempo a creare la sincronizzazione del tuo sviluppatore e del DB di produzione e utilizzare invece uno strumento standard. Ad esempio, utilizzo le funzionalità di Visual Studio Team Edition 2008 (o edizione del database) o Visual Studio 2010 Ultimate Edition per confrontare i dati in due database. Funziona molto bene.

+0

Ive ha ottenuto VS2010 - come si confrontano i dati in due database con quello? Hai un riferimento/link? – RPM1984

+1

Basta andare nel menu "Dati" scegliere "Confronta dati" e "Nuovo confronto dati". Quindi selezionare i database di origine e destinazione e "Opzioni di confronto dati". Quindi segui il wizard. Alla fine è possibile esaminare il confronto dei risultati, "deselezionare" alcune differenze e scrivere i risconti direttamente nel database di destinazione o generare uno script SQL. Nel menu "Strumenti" "Opzioni" puoi scegliere alcune opzioni di generazione del codice. Non è possibile solo confrontare i dati, ma anche confrontare lo schema dei database, se necessario. – Oleg

+0

Cool - ok maledizione, andateci domani (quando tornate al lavoro) e fatemi sapere come vado - evviva la punta! – RPM1984

4

C'è il SQL Data Compare da RedGate (anche se non è gratuito) e c'è anche SMO e la funzionalità built in.

Infine Wikipedia ha un elenco piuttosto completo di software.

+1

Lo strumento Confronto dati SQL RedGate non è gratuito. SMO è una buona idea, e il link di Wikipedia è un'ottima fonte. –

+1

Scusate Bernard ho interpretato erroneamente parte della domanda e in qualche modo l'ho interpretata come se fosse preferibile la libertà, anche se facoltativa, ho modificato la risposta per riflettere questo. Ho bisogno di più caffè, immagino. – Don

+0

Il link wikipedia ora, fastidiosamente. basta reindirizzare alla pagina principale di SQL Server. – Fishcake

2

È possibile utilizzare un generatore di script di dati che crea script per gli inserimenti e quindi utilizzare strumenti di confronto file come WinMerge per confrontare i file per trovare le differenze. C'è un articolo sulla generazione degli script di dati sul progetto di codice: http://www.codeproject.com/KB/database/sqlinsertupdategenerator.aspx

5

Se si desidera semplicemente sincronizzare le tabelle e non si preoccupa di rivedere le modifiche in anticipo, il comando MERGE può farlo.

MSDN - MERGE (Transact-SQL)

L'(gratuito) Microsoft SSDT ha anche i dati confronto e la sincronizzazione costruiti in se è più limitata di quanto strumenti di pagamento quali i dati Redgate confrontare.

0

È inoltre possibile provare a utilizzare il import and export data fornito da SQL Server 2008. È un modo abbastanza semplice per copiare tutti i dati da qualsiasi luogo a qualsiasi luogo. Faccio la stessa cosa e funziona perfettamente.

3

Poiché si tratta di una tantum, è possibile utilizzare questa query per trovare le righe che sono diverse in questo due tabelle:

(SELECT * FROM TABLE_A 
MINUS 
SELECT * FROM TABLE_B) 

UNION ALL 

(SELECT * FROM TABLE_B 
MINUS 
SELECT * FROM TABLE_A) 

MINUS metterà a confronto record campo per campo, poi si scarta record da prima tabella per che c'è un identico record nella seconda tabella. Questo funziona in questo modo:

  • Prima MINUS ottiene tutti i record da TABLE_A che non sono in TABLE_B
  • Seconda MINUS ottiene tutti i record da TABLE_B che non sono in TABLE_A
  • Unione ottiene tutti i record da entrambe le tabelle per il quale non c'è nessun record corrispondente in un'altra tabella.

Ora è possibile inserire quei record in una tabella temporanea e quindi fare inserimenti/aggiornamenti.

A seconda delle esigenze, è possibile limitare l'elenco dei campi per il confronto.

Nota che per funzionare è necessaria la chiave primaria.

Modifica:
Ooops. SQL Server non supporta l'operatore MINUS. Sto lavorando con ORACLE lo scorso anno e mezzo, quindi questo era automatico.

È possibile utilizzare invece l'operatore EXCEPT. Si veda questo articolo: EXCEPT and INTERSECT (Transact-SQL)

Edit 2:

Re scherand's commento:
Se davvero non può collegarsi dalla macchina locale a vivere di server, di lui può semplicemente scaricare TABLE_A e caricarlo sul server. In un modo o nell'altro, l'obiettivo è quello di modificare i dati della tabella sul server live.

+0

Interessante ... mai sentito parlare della parola chiave MINUS. Darò anche questo (e sì - la prima colonna è un PK - identità). – RPM1984

+0

Questo non funziona, a meno che OP non possa definire la sua workstation/server live come server collegato (come sottolineato da @Oleg) ... Cita: "Ricordare: la TABELLA A è sulla mia macchina locale TABELLA B è su il server live " – scherand

0

Si potrebbe provare il nostro Schema Compare for SQL Server

Questo strumento non è gratuito (è shareware), ma è possibile utilizzare 30 giorni di prova gratis e anche, si ha l'opportunità di ottenere una licenza gratuita per questo prodotto - si prega di fare riferimento al nostro free license conditions page.

3

mi sono imbattuto nello stesso problema come voi - cercato uno strumento gratuito che confronta i dati da due tabelle della MS SQL - e ha trovato nulla. Quindi ho creato una semplice utility da riga di comando freeware. Confronta i dati di due tabelle e crea statemiet INSERT/DELETE/UPDATE per rendere i dati della tabella di destinazione come la fonte. Ora sto utilizzando per il confronto dei dati, e come è completamente gratuito, posso consigliare di controllare fuori a: Sourceforge.net - UltraDBC

0

cosa succede se:

  1. copia devTableA su prod,
  2. sospendere le dipendenze su prodTableB
  3. rinominare prodTable B a prodTableB1,
  4. rinomina devTableA a prodTableB
  5. dipendenze reimplementare il nuovo prodTableB
  6. testare nuovo prodTableB e quindi eliminare il vecchio prodotto prodTableB

?

o se si deve essere più rispettosa della prodTableB esistente e i valori colonna di identità sia in dev e prod partita (anche se i valori non sono continui) ...

declare @iLast int, @x int, @y int 
select @iLast = (select MAX(id) from prodTableB) 
set @x = 1 
while @x <= @iLast 
begin 
    select @y = (select COUNT(*) from prodTableB where id = @x) 
    if @y = 1 
    begin 
     update prodTableB set isFoo = (select isFoo from devTableA where [email protected] 
    end 
    @[email protected]+1 
end 
6

risposta in ritardo, ma può essere utile ai visitatori del thread

Oltre alle altre soluzioni citate, posso suggerire di provare ApexSQL Data Diff. È in grado di confrontare e sincronizzare i dati del database di SQL Server (in database live e backup) e automatizzare e pianificare la migrazione dei dati. Funziona anche con enormi database ed è in grado di eseguire confronti direttamente da SSMS.

È possibile scaricare questo strumento gratuitamente e giocare con esso. È dotato di una versione di prova completamente funzionante e offre un'edizione di comunità (al termine del periodo di prova) che funziona su SQL Express e Database SQL di Azure.

Per ulteriori informazioni su questo strumento, si può visitare http://www.apexsql.com/sql_tools_datadiff.aspx

0

Si può anche dare un'occhiata a xSQL Data Compare. La versione di SQL Express è gratuita e c'è anche una versione Lite che farà il trucco per i piccoli database.

Un buon strumento gratuito è anche il confronto dei dati da SSDT.

Disclaimer: Sono affiliato con xSQL.

Problemi correlati