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