SQL Server合并语句

5

我正在编写存储过程中的合并语句。我需要在更新和插入期间计算行数。如果我使用一个通用变量来获取更新的行数(适用于更新和插入),那么如何区分这是从更新中得到的计数,还是从插入中得到的计数。请给我一个更好的方法。

1个回答

8
您可以创建一个表变量来保存操作类型,然后将伪列 $actionOUTPUT 输出到该变量中。
示例:
/*Table to use as Merge Target*/
DECLARE @A TABLE (
 [id] [int] NOT NULL PRIMARY KEY CLUSTERED,
 [C] [varchar](200) NOT NULL)

/*Insert some initial data to be updated*/
 INSERT INTO @A
 SELECT 1, 'A' UNION ALL  SELECT 2, 'B'

/*Table to hold actions*/
 DECLARE @Actions TABLE(act CHAR(6))

/*Do the Merge*/ 
   MERGE @A AS target
    USING (VALUES (1, '@a'),( 2, '@b'),(3, 'C'),(4, 'D'),(5, 'E')) AS source (id, C)
    ON (target.id = source.id)
       WHEN MATCHED THEN 
        UPDATE SET C = source.C 
    WHEN NOT MATCHED THEN    
        INSERT (id, C)
        VALUES (source.id, source.C)
    OUTPUT $action INTO @Actions;

   /*Check the result*/ 
    SELECT act, COUNT(*) AS Cnt
    FROM @Actions
    GROUP BY act

返回

act    Cnt
------ -----------
INSERT 3
UPDATE 2

什么数据可以存储到act列中?也就是说,如果我想知道有多少行被插入,我需要查询带有某些约束条件的表,为此我需要知道在插入发生时act列中可以存储什么数据?以及在更新发生时呢? - Robin clave
选择 @l_ins_row = COUNT(*) FROM @action WHERE act='inserted' - Robin clave
我需要获取每个操作的计数。 - Robin clave
@Robin - 我扩展了我的答案,包括演示。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接