PROBLEMAS con @@ROWCOUNT

17/07/2006 - 16:23 por Hugo Gsell | Informe spam
TENGO UN SERIO PROBLEMA .
tengo un procedimiento almacenado de actualización (ver abajo) que me
devuelve en un parametro de salida (NroRegsModificados) con la cantidad de
registros afectados por la transacción (en este caso en realidad simpre
debería ser 0 ó 1 ya que idpaso es clave).
Sin embargo, el procedimiento siempre me devuelve 1 aunque idpaso no
exista!!! es decir que no modificó ningún registro.
probando modificque el procedimiento almacenado para probarlo desde el mismo
sql... y si no graba nada me imrpima ese mensaje... y le mando actulizar un
registro que NO EXISTE y nunca muestra 'el error'
Que esta mal?

Hugo A. Gsell
Sgo del Estero
Argentina

CREATE PROCEDURE [dbo].[ActualizaPasos]
@pIdPaso smallint ,
@pDescripcion varchar(50),
@NroRegsModificados smallint output
AS
SET NOCOUNT OFF
DECLARE @error int
SET transaction isolation level SERIALIZABLE

BEGIN TRANSACTION
SET NOCOUNT ON;
UPDATE Pasos
SET Descripcion=@pDescripcion
WHERE IdPaso=@pIdPaso

SET @error = @@error
SET @NroRegsModificados=@@ROWCOUNT
IF @@ROWCOUNT=0
PRINT 'ERROR 0 REGISTROS GRABADOS'
IF @error != 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
RETURN @error
GO

Preguntas similare

Leer las respuestas

#1 Antonio Soto
17/07/2006 - 16:49 | Informe spam
Hola Hugo,

Tanto @@error, como @@rowcount devuelven siempre el valor de la anterior
instrucción ejecutada, por lo que en tu código @@rowcount está devolviendo
el valor del SET @error.. Cambia tus dos SET por select @error =
@@error, @NroRegsModificados=@@ROWCOUNT y verás como funciona


Antonio Soto
Solid Quality Learning
http://www.sqlu.com
Disclaimer: This communication is an original work and represents my sole
views on the subject. It does not represent the views of any other person
or entity either by inference or direct reference.
"Hugo Gsell" escribió en el mensaje
news:
TENGO UN SERIO PROBLEMA .
tengo un procedimiento almacenado de actualización (ver abajo) que me
devuelve en un parametro de salida (NroRegsModificados) con la cantidad de
registros afectados por la transacción (en este caso en realidad simpre
debería ser 0 ó 1 ya que idpaso es clave).
Sin embargo, el procedimiento siempre me devuelve 1 aunque idpaso no
exista!!! es decir que no modificó ningún registro.
probando modificque el procedimiento almacenado para probarlo desde el
mismo sql... y si no graba nada me imrpima ese mensaje... y le mando
actulizar un registro que NO EXISTE y nunca muestra 'el error'
Que esta mal?

Hugo A. Gsell
Sgo del Estero
Argentina

CREATE PROCEDURE [dbo].[ActualizaPasos]
@pIdPaso smallint ,
@pDescripcion varchar(50),
@NroRegsModificados smallint output
AS
SET NOCOUNT OFF
DECLARE @error int
SET transaction isolation level SERIALIZABLE

BEGIN TRANSACTION
SET NOCOUNT ON;
UPDATE Pasos
SET Descripcion=@pDescripcion
WHERE IdPaso=@pIdPaso

SET @error = @@error
SET @NroRegsModificados=@@ROWCOUNT
IF @@ROWCOUNT=0
PRINT 'ERROR 0 REGISTROS GRABADOS'
IF @error != 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
RETURN @error
GO


Respuesta Responder a este mensaje
#2 Alejandro Mesa
17/07/2006 - 16:56 | Informe spam
Hugo,

La variable global o funcion @@ROWCOUNT se actualiza por cada sentencia
ejecutada, por lo que debes capturar el valor inmediatamente despues de la
sentencia. Lo mismo pasa con @@ERROR

SET @error = @@error
SET @NroRegsModificados=@@ROWCOUNT



select @error = @@error, @NroRegsModificados = @@ROWCOUNT


CREATE PROCEDURE [dbo].[ActualizaPasos]
@pIdPaso smallint ,
@pDescripcion varchar(50),
@NroRegsModificados smallint output
AS
SET NOCOUNT ON;

DECLARE @error int

SET transaction isolation level SERIALIZABLE

BEGIN TRANSACTION

UPDATE Pasos
SET Descripcion=@pDescripcion
WHERE IdPaso=@pIdPaso

select @error = @@error, @NroRegsModificados = @@ROWCOUNT

IF @error != 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

RETURN @error
GO


AMB

"Hugo Gsell" wrote:

TENGO UN SERIO PROBLEMA .
tengo un procedimiento almacenado de actualización (ver abajo) que me
devuelve en un parametro de salida (NroRegsModificados) con la cantidad de
registros afectados por la transacción (en este caso en realidad simpre
debería ser 0 ó 1 ya que idpaso es clave).
Sin embargo, el procedimiento siempre me devuelve 1 aunque idpaso no
exista!!! es decir que no modificó ningún registro.
probando modificque el procedimiento almacenado para probarlo desde el mismo
sql... y si no graba nada me imrpima ese mensaje... y le mando actulizar un
registro que NO EXISTE y nunca muestra 'el error'
Que esta mal?

Hugo A. Gsell
Sgo del Estero
Argentina

CREATE PROCEDURE [dbo].[ActualizaPasos]
@pIdPaso smallint ,
@pDescripcion varchar(50),
@NroRegsModificados smallint output
AS
SET NOCOUNT OFF
DECLARE @error int
SET transaction isolation level SERIALIZABLE

BEGIN TRANSACTION
SET NOCOUNT ON;
UPDATE Pasos
SET Descripcion=@pDescripcion
WHERE IdPaso=@pIdPaso

SET @error = @@error
SET @NroRegsModificados=@@ROWCOUNT
IF @@ROWCOUNT=0
PRINT 'ERROR 0 REGISTROS GRABADOS'
IF @error != 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
RETURN @error
GO



Respuesta Responder a este mensaje
#3 Hugo Gsell
17/07/2006 - 17:42 | Informe spam
aún no lo probçe pero GRACIAS...
Hugo



"Antonio Soto" escribió en el mensaje
news:O1ki%
Hola Hugo,

Tanto @@error, como @@rowcount devuelven siempre el valor de la anterior
instrucción ejecutada, por lo que en tu código @@rowcount está devolviendo
el valor del SET @error.. Cambia tus dos SET por select @error =
@@error, @NroRegsModificados=@@ROWCOUNT y verás como funciona


Antonio Soto
Solid Quality Learning
http://www.sqlu.com
Disclaimer: This communication is an original work and represents my sole
views on the subject. It does not represent the views of any other person
or entity either by inference or direct reference.
"Hugo Gsell" escribió en el mensaje
news:
TENGO UN SERIO PROBLEMA .
tengo un procedimiento almacenado de actualización (ver abajo) que me
devuelve en un parametro de salida (NroRegsModificados) con la cantidad
de registros afectados por la transacción (en este caso en realidad
simpre debería ser 0 ó 1 ya que idpaso es clave).
Sin embargo, el procedimiento siempre me devuelve 1 aunque idpaso no
exista!!! es decir que no modificó ningún registro.
probando modificque el procedimiento almacenado para probarlo desde el
mismo sql... y si no graba nada me imrpima ese mensaje... y le mando
actulizar un registro que NO EXISTE y nunca muestra 'el error'
Que esta mal?

Hugo A. Gsell
Sgo del Estero
Argentina

CREATE PROCEDURE [dbo].[ActualizaPasos]
@pIdPaso smallint ,
@pDescripcion varchar(50),
@NroRegsModificados smallint output
AS
SET NOCOUNT OFF
DECLARE @error int
SET transaction isolation level SERIALIZABLE

BEGIN TRANSACTION
SET NOCOUNT ON;
UPDATE Pasos
SET Descripcion=@pDescripcion
WHERE IdPaso=@pIdPaso

SET @error = @@error
SET @NroRegsModificados=@@ROWCOUNT
IF @@ROWCOUNT=0
PRINT 'ERROR 0 REGISTROS GRABADOS'
IF @error != 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
RETURN @error
GO






Respuesta Responder a este mensaje
#4 Hugo Gsell
17/07/2006 - 17:42 | Informe spam
aún no lo probçe pero GRACIAS...
Hugo

"Alejandro Mesa" escribió en el
mensaje news:
Hugo,

La variable global o funcion @@ROWCOUNT se actualiza por cada sentencia
ejecutada, por lo que debes capturar el valor inmediatamente despues de la
sentencia. Lo mismo pasa con @@ERROR

SET @error = @@error
SET @NroRegsModificados=@@ROWCOUNT



select @error = @@error, @NroRegsModificados = @@ROWCOUNT


CREATE PROCEDURE [dbo].[ActualizaPasos]
@pIdPaso smallint ,
@pDescripcion varchar(50),
@NroRegsModificados smallint output
AS
SET NOCOUNT ON;

DECLARE @error int

SET transaction isolation level SERIALIZABLE

BEGIN TRANSACTION

UPDATE Pasos
SET Descripcion=@pDescripcion
WHERE IdPaso=@pIdPaso

select @error = @@error, @NroRegsModificados = @@ROWCOUNT

IF @error != 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

RETURN @error
GO


AMB

"Hugo Gsell" wrote:

TENGO UN SERIO PROBLEMA .
tengo un procedimiento almacenado de actualización (ver abajo) que me
devuelve en un parametro de salida (NroRegsModificados) con la cantidad
de
registros afectados por la transacción (en este caso en realidad simpre
debería ser 0 ó 1 ya que idpaso es clave).
Sin embargo, el procedimiento siempre me devuelve 1 aunque idpaso no
exista!!! es decir que no modificó ningún registro.
probando modificque el procedimiento almacenado para probarlo desde el
mismo
sql... y si no graba nada me imrpima ese mensaje... y le mando actulizar
un
registro que NO EXISTE y nunca muestra 'el error'
Que esta mal?

Hugo A. Gsell
Sgo del Estero
Argentina

CREATE PROCEDURE [dbo].[ActualizaPasos]
@pIdPaso smallint ,
@pDescripcion varchar(50),
@NroRegsModificados smallint output
AS
SET NOCOUNT OFF
DECLARE @error int
SET transaction isolation level SERIALIZABLE

BEGIN TRANSACTION
SET NOCOUNT ON;
UPDATE Pasos
SET Descripcion=@pDescripcion
WHERE IdPaso=@pIdPaso

SET @error = @@error
SET @NroRegsModificados=@@ROWCOUNT
IF @@ROWCOUNT=0
PRINT 'ERROR 0 REGISTROS GRABADOS'
IF @error != 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
RETURN @error
GO



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida