Sql Server 2008 MERGE - 获取计数的最佳方式

eid*_*lon 32 sql-server merge rowcount sql-server-2008

我想知道你们推荐什么作为从Sql Server中的MERGE语句获取动作计数的最佳方法.

所以,即我运行一个MERGE,它执行一些插入,一些更新和一些删除,...我希望能够找到HOW MANY插入,HOW MANY更新和删除多少.

最好的方法是什么?

mar*_*c_s 34

您可以在MERGE语句中指定OUTPUT子句,并获取MERGE期间已完成的输出报告.

MERGE (targetTable) AS t 
USING (sourceTable) AS s
ON t.ID = s.ID
WHEN MATCHED THEN
  (some statements)
WHEN NOT MATCHED THEN
  (some statements)
OUTPUT
  $action, inserted.ID 'inserted', deleted.ID 'deleted'
;
Run Code Online (Sandbox Code Playgroud)

这将为每个操作的每个"操作"(插入,更新,删除)提供一行.如果它是很多语句,你也可以输出到@tableVar然后查看表变量.

DECLARE @tableVar TABLE (MergeAction VARCHAR(20), InsertedID INT, DeletedID INT)

MERGE (targetTable) AS t 
USING (sourceTable) AS s
ON t.ID = s.ID
WHEN MATCHED THEN
      (some statements)
WHEN NOT MATCHED THEN
      (some statements)
OUTPUT
      $action, inserted.ID 'inserted', deleted.ID 'deleted' INTO @tableVar
;

SELECT MergeAction, COUNT(*) 
FROM @tableVar  
GROUP BY MergeAction
Run Code Online (Sandbox Code Playgroud)

有关MERGE语句和OUTPUT子句的详细信息,请查看联机丛书.


cro*_*sek 5

要提取到单个变量,可以使用pivot通过marc_s发布过程答案:

    declare
        @mergeResultsTable table (MergeAction VARCHAR(20));

    declare
        @insertCount int,
        @updateCount int,
        @deleteCount int;

    merge ...
    output $action into @mergeResultsTable; 

    select @insertCount = [INSERT],
           @updateCount = [UPDATE],
           @deleteCount = [DELETE]
      from (select 'NOOP' MergeAction -- row for null merge into null
             union all
            select * from @mergeResultsTable) mergeResultsPlusEmptyRow     
     pivot (count(MergeAction) 
       for MergeAction in ([INSERT],[UPDATE],[DELETE])) 
        as mergeResultsPivot;
Run Code Online (Sandbox Code Playgroud)

如果init变量为0或者知道源表或目标表具有> 0行,则可以删除union'nop'行.