SQL Server MERGE + Łączenie innych tabel

Używam instrukcji MERGE w projekcie bazy danych, aby zapełnić dane referencyjne ze statycznego zestawu wartości, takiego jak poniżej:

    MERGE INTO dbo.[User] AS TARGET
USING (VALUES
    ('me@somewhere.com', '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);

Problem pojawia się, gdy chcę zapełnić tabelę pomocniczą na podstawie zawartości w innych tabelach. Na przykład moja tabela UserPermission zawiera identyfikator użytkownika i identyfikator roli, a moja statyczna wartość jest ustawiona na coś podobnego („me@somewhere.com”, „Admin”) i można dołączyć do użytkownika i uprawnień, aby uzyskać Wartości identyfikacyjne dla WSTAWIANIA. Nie wiem, gdzie to zrobić ...

Edytować:

Tabela użytkownika (ID, nazwa użytkownika) 1, John Smith 2, Mark Wahlerg

Tabela ról (identyfikator, nazwa roli) 1, administrator 2, użytkownik 3, gość

Tabela ról użytkownika (identyfikator użytkownika, identyfikator roli)

Chcę, aby instrukcja SQL dla korespondencji seryjnej dostosowała tabelę roli użytkownika, tak aby można było określić coś takiego:

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

i połączy się, aby określić identyfikatory, wstawić kombinacje, które nie istnieją (i być może usunąć te, które to robią, ale nie znajdują się w MERGE.

Rozwiązanie:

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)