返回受UPDATE语句影响的行数

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

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 
 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 

这正是SQL Server 2005之后的OUTPUT子句的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使用集合函数,所以你需要在表variables或临时表中捕获INSERTED.*的输出并计算logging。 例如,

 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 

您可能需要随时收集统计信息,但@@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 

确保列types支持您要传递给它的值! 有同样的问题,因为我试图更新13(INT)字段宽度13位数值的数字。