TSQL MERGE具有插入,更新,删除的多个表

时间:2017-05-31 10:21:13

标签: c# asp.net sql-server tsql

我目前正在使用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?

您是否知道如何解决此问题,从而在包含多个表的合并语句中插入,更新,删除?

非常感谢!!

0 个答案:

没有答案