【问题标题】:Return number of rows affected by UPDATE statements返回受 UPDATE 语句影响的行数
【发布时间】:2009-07-09 11:18:38
【问题描述】:

如何在存储过程 (SQL Server 2005) 中获取受 UPDATE 查询影响的行数作为结果集。例如

CREATE PROCEDURE UpdateTables
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    UPDATE Table1 Set Column = 0 WHERE Column IS NULL
    UPDATE Table2 Set Column = 0 WHERE Column IS NULL
    UPDATE Table3 Set Column = 0 WHERE Column IS NULL
    UPDATE Table4 Set Column = 0 WHERE Column IS NULL
END

然后返回:

Table1    Table2    Table3    Table4
32        45        0         3

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:
    CREATE PROCEDURE UpdateTables
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        DECLARE @RowCount1 INTEGER
        DECLARE @RowCount2 INTEGER
        DECLARE @RowCount3 INTEGER
        DECLARE @RowCount4 INTEGER
    
        UPDATE Table1 Set Column = 0 WHERE Column IS NULL
        SELECT @RowCount1 = @@ROWCOUNT
        UPDATE Table2 Set Column = 0 WHERE Column IS NULL
        SELECT @RowCount2 = @@ROWCOUNT
        UPDATE Table3 Set Column = 0 WHERE Column IS NULL
        SELECT @RowCount3 = @@ROWCOUNT
        UPDATE Table4 Set Column = 0 WHERE Column IS NULL
        SELECT @RowCount4 = @@ROWCOUNT
    
        SELECT @RowCount1 AS Table1, @RowCount2 AS Table2, @RowCount3 AS Table3, @RowCount4 AS Table4
    END
    

    【讨论】:

      【解决方案2】:

      这正是 SQL Server 2005 及更高版本中的 OUTPUT 子句的出色之处。

      示例

      CREATE TABLE [dbo].[test_table](
          [LockId] [int] IDENTITY(1,1) NOT NULL,
          [StartTime] [datetime] NULL,
          [EndTime] [datetime] NULL,
      PRIMARY KEY CLUSTERED 
      (
          [LockId] ASC
      ) ON [PRIMARY]
      ) ON [PRIMARY]
      
      INSERT INTO test_table(StartTime, EndTime)
      VALUES('2009 JUL 07','2009 JUL 07')
      INSERT INTO test_table(StartTime, EndTime)
      VALUES('2009 JUL 08','2009 JUL 08')
      INSERT INTO test_table(StartTime, EndTime)
      VALUES('2009 JUL 09','2009 JUL 09')
      INSERT INTO test_table(StartTime, EndTime)
      VALUES('2009 JUL 10','2009 JUL 10')
      INSERT INTO test_table(StartTime, EndTime)
      VALUES('2009 JUL 11','2009 JUL 11')
      INSERT INTO test_table(StartTime, EndTime)
      VALUES('2009 JUL 12','2009 JUL 12')
      INSERT INTO test_table(StartTime, EndTime)
      VALUES('2009 JUL 13','2009 JUL 13')
      
      UPDATE test_table
          SET StartTime = '2011 JUL 01'
          OUTPUT INSERTED.* -- INSERTED reflect the value after the UPDATE, INSERT, or MERGE statement is completed 
      WHERE
          StartTime > '2009 JUL 09'
      

      返回以下结果

          LockId StartTime                EndTime
      -------------------------------------------------------
      4      2011-07-01 00:00:00.000  2009-07-10 00:00:00.000
      5      2011-07-01 00:00:00.000  2009-07-11 00:00:00.000
      6      2011-07-01 00:00:00.000  2009-07-12 00:00:00.000
      7      2011-07-01 00:00:00.000  2009-07-13 00:00:00.000
      

      在您的特定情况下,由于您不能对 OUTPUT 使用聚合函数,因此您需要在表变量或临时表中捕获 INSERTED.* 的输出并计算记录。例如,

      DECLARE @temp TABLE (
        [LockId] [int],
        [StartTime] [datetime] NULL,
        [EndTime] [datetime] NULL 
      )
      
      UPDATE test_table
          SET StartTime = '2011 JUL 01'
          OUTPUT INSERTED.* INTO @temp
      WHERE
          StartTime > '2009 JUL 09'
      
      
      -- now get the count of affected records
      SELECT COUNT(*) FROM @temp
      

      【讨论】:

      • OUTPUT INSERTED.* INTO @temp 正是我想要的
      【解决方案3】:

      您可能需要随时收集统计数据,但@@ROWCOUNT 捕捉到了这一点:

      declare @Fish table (
      Name varchar(32)
      )
      
      insert into @Fish values ('Cod')
      insert into @Fish values ('Salmon')
      insert into @Fish values ('Butterfish')
      update @Fish set Name = 'LurpackFish' where Name = 'Butterfish'
      select @@ROWCOUNT  --gives 1
      
      update @Fish set Name = 'Dinner'
      select @@ROWCOUNT -- gives 3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-08
        • 2017-01-02
        • 1970-01-01
        • 2011-09-07
        • 2016-09-24
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        相关资源
        最近更新 更多