Ever had to merge two tables in SQL? Hard work?
The MERGE statement is only available in SQL Server 2008 (and Oracle and DB2 ;) ), but in the meantime - you can mimic it.
If you ever had a large csv file with a new version of data already contained in a table in SQL, you dreamed of something like this, didn't you:
MERGE t1In other words: if the id of a row in the new version matches one in the old version - update the old row; otherwise - insert a new row.
USING (SELECT @id AS id, @name1 AS name1) AS t2 ON t1.id = t2.id
WHEN MATCHED
THEN UPDATE SET t1.name1 = t2.name1
WHEN NOT MATCHED
THEN INSERT VALUES(@id, @name1)
[Of course we're assuming here that you managed to load the contents of the csv file into a staging table].
Well, if you have the luxury of working with SQL Server 2008, the construct above is exactly what you could use there. Have a look here: Using MERGE statement.
Now, since SQL Server 2008 is not yet used in too many commercial projects ;) - it is often the case that you have to implement such functionality on your own.
According to Alex Kuznetsov (MVP):
In SQL Server 2005 you can use OUTPUT clause of an UPDATE statementin order to achieve that.
See for yourself:
declare @updated_ids table(id int)Pretty neat!
update permanent set d=s.d, comment = 'Modified Row'
output inserted.id into @updated_ids
from permanent p, staging s
where p.id=s.id
insert into permanent
select id, d, 'New Row' from staging where id not in(select id from @updated_ids)
go
You can find Alex's whole post here: Mimicking MERGE Statement in SQL 2005.