updated update example ejemplos affected sql sql-server

example - sql get updated row count



Devuelve el nĂºmero de filas afectadas por las declaraciones UPDATE (4)

¡Asegúrese de que el tipo de columna admita el valor que está intentando pasarle! Tenía el mismo problema porque estaba intentando actualizar un ancho de campo de 13 (INT) y un número de valor de 13 dígitos.

¿Cómo puedo obtener el número de filas afectadas por una consulta de ACTUALIZACIÓN en un procedimiento almacenado (SQL Server 2005), como un conjunto de resultados? p.ej

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

Entonces regresa:

Table1 Table2 Table3 Table4 32 45 0 3


Es posible que deba recopilar las estadísticas a medida que @@ROWCOUNT , pero @@ROWCOUNT captura esto:

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


Esto es exactamente para lo que la cláusula OUTPUT en SQL Server 2005 en adelante es excelente.

EJEMPLO

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

Los resultados en los siguientes son devueltos

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

En su caso particular, ya que no puede usar funciones agregadas con OUTPUT , necesita capturar la salida de INSERTED.* En una tabla variable o tabla temporal y contar los registros. Por ejemplo,

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


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