我目前正在使用SQL Server 2012上的T-SQL中的存储过程。这个任务非常棘手:我需要在多个表中合并(插入,更新,删除)条目。
为方便起见,我尝试用2个表解释我的问题。我在ASP.NET 4.5 MVC应用程序中使用C#中的Dapper并可以控制我的前端。我正在进入存储过程2临时表:
临时表目标:
ID | TargetId | TargetGroupId | IsPublic | IsPrivate |
---+----------+---------------+----------+-----------+
0 | 42 | 1 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
2 | 0 | 1 | 0 | 1 |
临时表目标国家
ID |CountryId | TargetId |
---+----------+----------+
0 | CA | 42 |
1 | FR | 0 |
2 | AU | 0 |
TargetId 0 对应一个新条目,因此,如果 TargetId = 0 ,我想插入或删除不是来自的旧记录列表,如果 TargetId> 0 我想更新记录。
最终结果可能如下所示:
表格目标:
| TargetId | TargetGroupId | IsPublic | IsPrivate |
+----------+---------------+----------+-----------+
| 42 | 1 | 0 | 1 |
| 93 | 1 | 1 | 0 |
| 94 | 1 | 0 | 1 |
表国家/地区:
CId |CountryId | TargetId |
-----+----------+----------+
34 | CA | 42 |
35 | FR | 93 |
36 | AU | 94 |
因此新的TargetId也应存储在Country中。我当前的TSQL脚本如下所示:
DECLARE @TargetGroupId = 1;
MERGE [MySchema].[Target] AS [A]
USING @Targets AS [B]
ON ([A].TargetId = [B].TargetId)
WHEN NOT MATCHED BY TARGET THEN
INSERT (TargetGroupId, IsPrivate, IsPublic)
VALUES (@TargetGroupId, [B].IsPrivate, [B].IsPublic)
-- Desired behaviour: doesn't work unfortunately...
-- OUTPUT inserted.TargetId, [B].ID
-- INTO #tmp;
WHEN MATCHED THEN
UPDATE
SET [A].IsPrivate = [B].IsPrivate, [A].IsPublic = [B].IsPublic
WHEN NOT MATCHED BY SOURCE AND [A].TargetGroupId = @TargetGroupId
THEN DELETE;
这个SQL脚本适用于我的目标Target,但是如何更新我的第二个表Country?
您是否知道如何解决此问题,从而在包含多个表的合并语句中插入,更新,删除?
非常感谢!!