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