merge di dati
jpredhat
jpredhat non è online. Ultima attività: 03/12/2008 10.25.42jpredhat
il 3 dicembre 2008 alle 09.39
2 messaggi dal 11 aprile 2008
Salve a tutti, avrei una richiesta abbastanza urgente:
Un' istanza di sql server 2005 express ha due database con identica struttura ma dati diversi: c'è modo di fare un merge dei dati con tools (free) o query ad hoc?

grazie a tutti.
Microsoft Most Valuable Professional
Re: merge di dati
Andrea Montanari
Andrea Montanari non è online. Ultima attività: 04/07/2009 16.52.37Andrea Montanari Top Poster
il 3 dicembre 2008 alle 10.12
Contributi | www.asql.biz | 1.134 messaggi dal 27 luglio 2005
salve,
jpredhat wrote:
Salve a tutti, avrei una richiesta abbastanza urgente: Un' istanza di sql server 2005 express ha due database con identica struttura ma dati diversi: c'è modo di fare un merge dei dati con tools (free) o query ad hoc?


tools gratuiti non ne conosco.. conosco
http://www.red-gate.com/products/SQL_Data_Compare/index.htm, ma ovviamente e' "a pagamento"..

dici che i 2 db sono sulla stessa istanza e quindi puoi anche giocarti la carta di query di inserimento..
potresti ad esempio eseguire un datapump con una join tra le 2 tabelle e caricare le righe inesistenti nella tabella di destinazione (sul principio della chiave primaria) dalla verifica che essa sia null, similarmente a SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t1 (
Id int NOT NULL PRIMARY KEY,
Data varchar(10)
);
CREATE TABLE dbo.t2 (
Id int NOT NULL PRIMARY KEY,
Data varchar(10)
);
INSERT INTO dbo.t1 VALUES ( 1, 'a' );
INSERT INTO dbo.t1 VALUES ( 2, 'b' );
INSERT INTO dbo.t1 VALUES ( 3, 'c' );

INSERT INTO dbo.t2 VALUES ( 2, 'd' );
INSERT INTO dbo.t2 VALUES ( 4, 'z' );

GO
INSERT INTO dbo.t2
SELECT t1.Id, t1.Data
FROM dbo.t1 t1
FULL JOIN dbo.t2 t2 ON t1.Id = t2.Id
WHERE t2.Id IS NULL;

SELECT * FROM dbo.t2;
GO
DROP TABLE dbo.t1, dbo.t2;
--<-----
Id Data
---------
----------
1 a
2 d
3 c
4 z

un po' piu' problematica e' la "soluzione" dei conflitti.. nell'esempio, entrambe le tabella contengono una riga identificata da {Id} = 2, ma il valore dell'attributo {Data} e' diverso... se la "situazione" va gestita, devi qui definire una regola.. potresti ad esempio far precedere all'insert un'update simile,
UPDATE dbo.t2
SET Data = t1.Data
FROM dbo.t1 t1
JOIN dbo.t2 t2 ON t1.Id = t2.Id;

che, sulla base della risoluzione del confronto, aggiorna le sole righe esistenti nella tabella di destinazione con il valore degli attributi della tabella "di origine"..
la "regola" potrebbe non essere corretta, ma puoi "parzialmente" complicarla.. ad esempio puoi anche scrivere
UPDATE dbo.t2
SET Data = CASE WHEN t1.Id < 5 THEN t1.Data ELSE t2.Data END FROM dbo.t1 t1
JOIN dbo.t2 t2 ON t1.Id = t2.Id;
dove l'aggiornamento viene eseguito solo nel caso che {Id} sia inferiore a 5.. la regola pero' puo' anche essere una validazione a piu' colonne, anche se ovviamente potrebbe essere complicata da definire..
saluti

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
http://www.hotelsole.com - http://www.hotelsolericcione.de

Vai a:
Torna al forum |   Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.

Powered by .db Forums "Caesar Reborn" v. 2009.6.9