De FUSION SQL Server + se Joindre à d'autres tables

Je suis à l'aide de l'instruction MERGE dans un projet de base de données pour remplir les données de référence d'une valeur statique, telle que la suivante ci-dessous:

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

Le problème vient quand je veux remplir la table secondaire en fonction du contenu dans d'autres tables. Par exemple, mon UserPermission table contient les ID utilisateur et ID de rôle et j'aimerais que mon statique de la valeur définie pour être quelque chose comme ('[email protected]', 'Admin') et être en mesure de se joindre à l'Utilisateur et l'Autorisation d'obtenir les valeurs d'ID pour l'Insertion. Vous ne savez pas où faire pour que...

Edit:

Table utilisateur(ID, nom d'utilisateur)
1, John Smith
2, Marque Wahlerg

Rôle de la Table(ID, RoleName)
1, Administrateur
2, l'Utilisateur
3, Invité

De Rôle d'utilisateur Table (ID Utilisateur, ID de Rôle)

Je veux le SQL pour l'instruction MERGE pour ajuster le Rôle d'Utilisateur tableau de manière à ce que je peux faire préciser quelque chose comme:

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

et il se joindra à déterminer l'Id, insérer les combinaisons qui n'existe (et peut-être de supprimer celles qui ne, mais ne sont pas dans la FUSION.

Solution:

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)
Juste par curiosité, pourquoi êtes-vous à l'aide de FUSION ici au lieu de beaucoup plus simple INSERT ... SELECT? Je ne dis pas que vous ne pouvez pas faire cela avec MERGE mais il semble excessif pour une telle opération triviale.
c'est un exemple simpliste, normalement j'ai plusieurs lignes et l'utilisation de la mise à JOUR et de SUPPRIMER des capabiltities de FUSION. J'ai essayé d'isoler le problème.
Le problème est dans votre USING clause. Vous avez juste valeurs codées en dur; vous devez vraiment être à l'aide d'un SELECT si vous avez besoin de tirer de ces valeurs à partir d'une table. Il y a aussi quelques jolis gens intelligents qui peuvent aider à résoudre vos problèmes, mais ils sont beaucoup plus intéressés à la résolution de votre problème réel - simplifier à l'excès mène juste à des questions inutiles comme celle que j'ai posée.
Je ne vois pas une raison pour ne pas changer l'insert en supprimant les valeurs de (...)' à un 'select' qui comprend votre champs statiques et se joint également à d'autres tables de regarder les id.
Ces valeurs sont destinés à être codé en dur, mais le problème est que je ne veux pas insérer ces valeurs, mais plutôt de l'IDs à partir d'autres tables basées sur les valeurs codées en dur. L'exemple est celui qui travaille maintenant. Le problème, c'est de prendre la prochaine étape, qui est le problème décrit par la suite.

OriginalL'auteur Rich | 2012-05-09