11

我在数据库项目中使用 MERGE 语句从静态值集中填充参考数据,如下所示:

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

当我想根据其他表中的内容填充辅助表时,问题就出现了。例如,我的 UserPermission 表包含用户 ID 和角色 ID,我希望我的静态值设置为 ('me@somewhere.com', 'Admin') 并且能够加入用户和权限以获得插入的 ID 值。不知道在哪里做...

编辑:

用户表(ID、用户名)1、John Smith 2、Mark Wahlerg

角色表(ID, RoleName) 1, Administrator 2, User 3, Guest

用户角色表(用户 ID、角色 ID)

我希望 MERGE 语句的 SQL 来调整 User-Role 表,以便我可以指定如下内容:

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

它将加入以确定 ID,插入不存在的组合(并可能删除存在但不在 MERGE 中的组合。

解决方案:

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

1 回答 1

10

Merge 支持 CTE,因此也许您可以将其用作源,组合您的静态数据并在 cte 中执行任何连接。

于 2012-05-09T19:58:30.890 回答