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>