我使用的数据库项目中的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”,“管理员”),并能够加盟用户和权限,以获得用于插入ID值。 不知道在哪里做的是...
编辑:
用户表(ID,用户名)1,约翰·史密斯2,马克Wahlerg
角色表(ID,角色名)1,管理员2,用户3,访客
用户 - 角色表(用户ID,角色ID)
我想要对MERGE语句SQL调整用户角色表,这样我可以做规定是这样的:
USING(VALUES
('John Smith', 'Administrator'),
('Mark Wahlburg', 'User')
它将加入到确定的ID,插入不存在(也许删除做好些,但不是在合并组合。
解:
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)