2008-04-20

MERGE-Statement in Microsoft SQL Server 2008

Mit Hilfe des MERGE-Statements können die Daten aus der Quelle in die Ziel-Tabelle unter bestimmten Bedingungen transferiert werden.

Das MERGE-Statement in Microsoft SQL Server 2008 kann in die Ziel-Tabelle neuen Datensätze hinzufügen oder die bestehenden Datensätze aktualisieren. Dabei können Kriterien definiert werden, unter welche Bedingung ein Datensatz in der Ziel-Tabelle aktualisiert oder hinzugefügt werden soll. Die Löschung einen Datensatz in der Ziel-Tabelle kann ebenfalls mit Hilfe des MERGE-Statements implementiert werden.

Der folgende Beispiel-Code erstellt in der Datenbank zwei neue Datenbanktabellen mit dem Namen Country1 (C1) und Country2 (C2). Die Tabelle C1 wird als Ziel und C2 wird als Quelle in dem Beispiel verwendet. In der C1 werden drei neue Einträge und in der C2 werden vier neue Einträge erstellt.

-- Erstellen Ziel-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country1](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)

-- Erstellen drei neue Datensätze in der Datenbanktabelle Country1 (Ziel)
INSERT INTO [dbo].[Country1] ([ID], [Country])
SELECT 1, 'SWITZERLAND' UNION ALL
SELECT 2, 'GERMANY' UNION ALL
SELECT 3, 'AUSTRIA'


-- Erstellen Quelle-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country2](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)


-- Erstellen vier Datensätze in der Datenbanktabelle Country2 (Quelle)
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (1, 'SWITZERLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (2, 'DEUTSCHLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (4, 'TURKIYE')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (5, 'ITALY')




Für den INSERT darf die ID der C2-Tabelle in der C1-Tabelle nicht vorkommen (TARGET NOT MATCHED THEN):



MERGE [Country1] AS C1
USING [Country2] AS C2
ON C1.ID = C2.ID

-- Wenn, ID der C2 in der Tabelle C1 nicht vorhanden ist,
-- dann wird der Datensatz in der C1 erstellt (INSERT)
WHEN TARGET NOT MATCHED THEN
INSERT (ID, Country)
VALUES (C2.ID, C2.Country)


Und für den UPDATE muss die ID der C1-Tabelle in der C2-Tabelle vorhanden sein (MATCHED AND C1.ID = C2.ID):



-- Wenn, ID der C2 in der Tabelle C1 vorhanden ist,
-- dann wird der Datenatz in der C1 aktualisert (UPDATE)
WHEN MATCHED AND C1.ID = C2.ID THEN
UPDATE SET Country = C2.Country;




Der ganze Beispielcode ist unten aufgelistet:



--BEGIN TRANSACTION

-- Wenn die Datenbanktabelle Country1 (Ziel) oder Country2 (Quelle) in der Datenbank bereits exisitiert,
-- werden sie zuerst gelöscht.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Country1]') AND type in (N'U'))
DROP TABLE [dbo].[Country1]
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Country2]') AND type in (N'U'))
DROP TABLE [dbo].[Country2]
GO


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- Erstellen Ziel-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country1](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)



-- Erstellen drei neue Datensätze in der Datenbanktabelle Country1 (Ziel)
INSERT INTO [dbo].[Country1] ([ID], [Country])
SELECT 1, 'SWITZERLAND' UNION ALL
SELECT 2, 'GERMANY' UNION ALL
SELECT 3, 'AUSTRIA'



-- Erstellen Quelle-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country2](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)




-- Erstellen vier Datensätze in der Datenbanktabelle Country2 (Quelle)
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (1, 'SWITZERLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (2, 'DEUTSCHLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (4, 'TURKIYE')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (5, 'ITALY')


-- Ausgeben Inhalte der beiden Tabellen
SELECT * FROM Country1
SELECT * FROM Country2


              
-- Verwendung MERGE-Statement
MERGE [Country1] AS C1
USING [Country2] AS C2
ON C1.ID = C2.ID

-- Wenn, ID der C2 in der Tabelle C1 nicht vorhanden ist,
-- dann wird der Datensatz in der C1 erstellt (INSERT)
WHEN TARGET NOT MATCHED THEN
INSERT (ID, Country)
VALUES (C2.ID, C2.Country)

-- Wenn, ID der C2 in der Tabelle C1 vorhanden ist,
-- dann wird der Datenatz in der C1 aktualisert (UPDATE)
WHEN MATCHED AND C1.ID = C2.ID THEN
UPDATE SET Country = C2.Country;


-- Ausgeben Inhalte der beiden Tabellen
SELECT * FROM Country1
SELECT * FROM Country2

--ROLLBACK TRANSACTION


Wenn die Daten der Tabelle C1 vor und nach Verwendung des MERGE-Statements verglichen werden, sehen die Daten wie folgt aus:

MERGESample



Bemerkung: Die Verwendung von BEGIN und ROLLBACK-Transaction haben keinen Einfluss auf das Beispiel. Ich wollte nur meine Datenbank sauber halten :-)

No comments: