SQL Server MERGE + unindo outras tabelas

Eu estou usando a instrução MERGE dentro de um projeto de banco de dados para preencher dados de referência de um conjunto de valores estáticos, como o seguinte:

<code>    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);
</code>

O problema surge quando quero preencher a tabela secundária com base no conteúdo de outras tabelas. Por exemplo, minha tabela UserPermission contém ID de usuário e ID de função e gostaria que meu valor estático definido fosse algo como ('[email protected]', 'Admin') e pudesse ingressar ao Usuário e à Permissão para obter o Valores de ID para INSERT. Não tenho certeza de onde fazer isso ...

Editar:

Tabela de usuários (ID, nome de usuário) 1, John Smith 2, Mark Wahlerg

Tabela de Funções (ID, RoleName) 1, Administrador 2, Usuário 3, Convidado

Tabela de Funções do Usuário (ID do Usuário, ID da Função)

Eu quero o SQL para a instrução MERGE para ajustar a tabela de função do usuário, de modo que eu possa especificar algo como:

<code>USING(VALUES
 ('John Smith', 'Administrator'),
 ('Mark Wahlburg', 'User')
</code>

e ele se unirá para determinar os IDs, insira as combinações que não existem (e talvez exclua as que o fazem, mas que não estão na MERGE.

Solução:

<code>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)
</code>

questionAnswers(1)

yourAnswerToTheQuestion