2010-02-16 30 views

Respuesta

77

@@ ROWCOUNT indicará el número de filas afectadas por la última instrucción SQL, lo mejor es capturarlo en una variable local siguiendo el comando en cuestión, ya que su valor cambiará la próxima vez que lo mire :

DECLARE @Rows int 
DECLARE @TestTable table (col1 int, col2 int) 
INSERT INTO @TestTable (col1, col2) select 1,2 union select 3,4 
SELECT @[email protected]@ROWCOUNT 
SELECT @Rows AS Rows,@@ROWCOUNT AS [ROWCOUNT] 

SALIDA:

(2 row(s) affected) 
Rows  ROWCOUNT 
----------- ----------- 
2   1 

(1 row(s) affected) 

que presentamos lo Rows valor de 2, el número de filas insertadas, pero ROWCOUNT es 1 porque el comando SELECT @[email protected]@ROWCOUNT afectada fila 1

si tiene múltiples INSERTOS o ACTUALIZACIONES, etc. en su transacción, debe determinar cómo le gustaría "contar" lo que está sucediendo. Podría tener un total por separado para cada tabla, un único gran valor total o algo completamente diferente. Tendrá que declarar una variable para cada total que desea seguir y agregar a ella después de cada operación que se aplica a ella:

--note there is no error handling here, as this is a simple example 
DECLARE @AppleTotal int 
DECLARE @PeachTotal int 

SELECT @AppleTotal=0,@PeachTotal=0 

BEGIN TRANSACTION 

INSERT INTO Apple (col1, col2) Select col1,col2 from xyz where ... 
SET @[email protected][email protected]@ROWCOUNT 

INSERT INTO Apple (col1, col2) Select col1,col2 from abc where ... 
SET @[email protected][email protected]@ROWCOUNT 

INSERT INTO Peach (col1, col2) Select col1,col2 from xyz where ... 
SET @[email protected][email protected]@ROWCOUNT 

INSERT INTO Peach (col1, col2) Select col1,col2 from abc where ... 
SET @[email protected][email protected]@ROWCOUNT 

COMMIT 

SELECT @AppleTotal AS AppleTotal, @PeachTotal AS PeachTotal 
+1

En lugar de utilizar SELECT @Rows = @@ ROWCOUNT', probé 'set @Rows = @@ ROWCOUNT' y recibido aún los mismos resultados. ¡Gracias, buena publicación! – MikeTeeVee

+0

FYI: _Even_ envolviendo mi declaración INSERT en las instrucciones de Transaction block provocó que se reiniciara @@ RowCount, ¡así que tuve que establecer la variable @Rows antes de llamar a Commit! – MikeTeeVee

+1

@MikeTeeVee usando 'SELECT' puede hacer múltiples asignaciones en una sola instrucción, por lo que puede agregar fácilmente 'SELECT @Rows = @@ ROWCOUNT, @ID = SCOPE_IDENTITY(), @Error = @@ ERROR'. Con 'SET' solo puedes establecer un valor. 'TRY CATCH' elimina la necesidad de capturar' @@ ERROR', pero todavía uso 'SELECT'. –

2

En caso de necesitar más información para su registro/auditoría que pueda cláusula OUTPUT: De esta manera, no solo mantiene el número de filas afectadas, sino también los registros.

Como un ejemplo de la Cláusula de salida en caso de insertos: SQL Server list of insert identities

DECLARE @InsertedIDs table(ID int); 

INSERT INTO YourTable 
    OUTPUT INSERTED.ID 
     INTO @InsertedIDs 
    SELECT ... 

HTH

2

he encontrado la respuesta a mayo post anterior. Aquí está.

CREATE TABLE #TempTable (id int) 

INSERT INTO @TestTable (col1, col2) OUTPUT INSERTED.id INTO #TempTable select 1,2 

INSERT INTO @TestTable (col1, col2) OUTPUT INSERTED.id INTO #TempTable select 3,4 

SELECT * FROM #TempTable --this select will chage @@ROWCOUNT value 
Cuestiones relacionadas