2012-05-09 7 views
8

Ich bin mit der MERGE-Anweisung in einer Datenbank Projekt Referenzdaten von einem statischen Wert gesetzt, wie die unten folgenden bevölkern:SQL Server MERGE + Joining andere Tabellen

MERGE INTO dbo.[User] AS TARGET 
USING (VALUES 
    ('[email protected]', 'My Name')) 
AS SOURCE(UserName, FullName) 
ON SOURCE.UserName = TARGET.UserName 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (UserId, UserName, FullName) 
    VALUES (NEWID(), UserName, FullName); 

Das Problem kommt, wenn ich will um die Sekundärtabelle basierend auf Inhalt in anderen Tabellen aufzufüllen. Zum Beispiel enthält meine UserPermission-Tabelle die Benutzer-ID und die Rollen-ID und ich möchte, dass mein statischer Wert auf etwas wie ('[email protected]', 'Admin') gesetzt ist und ich kann mich mit Benutzer und Erlaubnis verbinden ID-Werte für INSERT. Nicht sicher, wo das zu tun ...

Edit:

Benutzertabelle (ID, Benutzername) 1, John Smith 2, Mark Wahlerg

Rolle Tabelle (ID, Rolename) 1, Administrator 2, Benutzer 3, Gast

Benutzer-Rollen-Tabelle (Benutzer-ID, Rollen ID)

ich die SQL für die MERGE-Anweisung will ADJU st der Benutzer-Rollen-Tabelle so, dass ich so etwas angeben können:

USING(VALUES 
('John Smith', 'Administrator'), 
('Mark Wahlburg', 'User') 

und es wird kommen Sie mit den IDs zu bestimmen, die Kombinationen einfügen, existiert nicht (und vielleicht auch diejenigen löschen, die tun, sind aber nicht in der MERGE.

Lösung:

WITH CTE AS 
(
    SELECT UserId, RoleId 
    FROM (VALUES 
     ('John Smith', 'Administrator'), 
     ('Mark Wahlburg', 'User')) 
     AS SOURCE(UserName, RoleName) 
    INNER JOIN User ON SOURCE.UserName = User.UserName 
    INNER JOIN Role ON SOURCE.RoleName = Role.RoleName 
) 
MERGE INTO UserRole AS TARGET 
USING CTE 
ON CTE.UserId = TARGET.UserID AND CTE.RoleId = TARGET.UserId 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT(UserId, RoleId) 
    VALUES(UserId, RoleId) 
+0

Nur neugierig, warum verwenden Sie MERGE hier anstelle einer viel einfacheren "INSERT ... SELECT"? Ich sage nicht, dass du das nicht mit "MERGE" machen kannst, aber es scheint übertrieben für solch eine triviale Operation. –

+0

@AaronBertrand, dies ist ein einfaches Beispiel, normalerweise habe ich mehrere Zeilen und verwende die UPDATE- und DELETE-Fähigkeiten von MERGE. Ich habe versucht, das Problem zu isolieren. – Rich

+0

Das Problem liegt in Ihrer 'USING'-Klausel. Du hast dort nur fest codierte Werte; Sie benötigen es, um ein SELECT zu verwenden, wenn Sie diese Werte aus einer Tabelle ziehen müssen. Außerdem gibt es einige schlaue Leute, die Ihnen helfen können, Ihre Probleme zu lösen, aber sie sind viel mehr daran interessiert, Ihr tatsächliches Problem zu lösen - es zu verdummen, führt nur zu unnötigen Fragen wie die, die ich gestellt habe. –

Antwort

8

Merge unterstützt CTE so vielleicht können Sie diese als Quelle verwenden, Ihre statischen Daten kombiniert und jede Durchführung schließt sich innerhalb des CTE.

+1

Das war der Trick.Meine Erfahrung mit CTEs und Tabellenwertkonstruktoren war ein wenig schwach, daher weiß ich nicht, wo sie verwendet (und zusammen verwendet) werden können. – Rich