Return number of rows affected by UPDATE statements

前端 未结 3 1994
暖寄归人
暖寄归人 2020-11-30 05:29

How can I get the number of rows affected by an UPDATE query in a Stored Procedure (SQL Server 2005), as a resultset. e.g.

CREATE PROCEDURE UpdateTables
AS
B         


        
相关标签:
3条回答
  • 2020-11-30 05:41

    You might need to collect the stats as you go, but @@ROWCOUNT captures this:

    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
    
    0 讨论(0)
  • 2020-11-30 05:46
    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
    
    0 讨论(0)
  • 2020-11-30 06:01

    This is exactly what the OUTPUT clause in SQL Server 2005 onwards is excellent for.

    EXAMPLE

    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'
    

    Results in the following being returned

        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
    

    In your particular case, since you cannot use aggregate functions with OUTPUT, you need to capture the output of INSERTED.* in a table variable or temporary table and count the records. For example,

    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
    
    0 讨论(0)
提交回复
热议问题