データベースプロジェクト内で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')のように設定し、UserandPermissionに参加してINSERTのID値。どこに行けばいいのかわからない...
編集:
ユーザーテーブル(ID、ユーザー名)1、John Smith 2、Mark Wahlerg
ロールテーブル(ID、RoleName)1、管理者2、ユーザー3、ゲスト
ユーザーロールテーブル(ユーザー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)