【问题标题】:SQL Server Merge statementSQL Server 合并语句
【发布时间】:2011-07-05 19:17:53
【问题描述】:

我正在我的存储过程中执行合并语句。我需要在更新和插入期间计算行数。如果我使用一个公共变量来获取更新的行(对于更新和插入)我可以如何不同,这是我从更新中获得的计数,这是我从插入中获得的计数。请给我一个更好的方法

【问题讨论】:

    标签: sql-server sql-server-2008 merge


    【解决方案1】:

    您可以创建一个表变量来保存操作类型,然后将OUTPUT$action 列添加到它。

    例子

    /*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 列中。也就是说,如果我想知道插入了多少行,我需要使用一些约束权查询表,因为我需要知道 wat 数据可以插入发生时进入行为列?以及何时更新?
    • 'select @l_ins_row= COUNT(*) from @action where act='inserted''
    • 就像我需要获取每个操作的计数
    • @Robin - 我扩展了我的答案以包含演示。
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多