Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
JavierVera
Starting Member
4 Posts |
Posted - 2013-10-24 : 12:15:18
|
I have the following code:DECLARE @SERVICIO CHAR(2)SET @SERVICIO = '11' BEGIN TRANSACTION GET_NEXT_CORR DECLARE @NEXT_VALUE INT SET @NEXT_VALUE = ( SELECT TOP 1 (A.valor + 1) FROM correlativo A WHERE NOT EXISTS (SELECT 1 FROM correlativo B WHERE B.valor = (A.valor + 1)) AND A.valor NOT IN (SELECT MAX(C.valor) FROM correlativo C) ORDER BY 1) IF @NEXT_VALUE IS NULL BEGIN SET @NEXT_VALUE = (SELECT ISNULL(MAX(valor)+1,1) FROM correlativo) INSERT INTO correlativo VALUES (@SERVICIO, @NEXT_VALUE) IF (@@ERROR <> 0) BEGIN PRINT '1' GOTO CORR_HANDLER END END ELSE BEGIN INSERT INTO correlativo VALUES (@SERVICIO, @NEXT_VALUE) IF (@@ERROR <> 0) BEGIN PRINT '2' GOTO CORR_HANDLER END END IF (@@ERROR <> 0) BEGIN PRINT '3' GOTO CORR_HANDLER END COMMIT TRANSACTION GET_NEXT_CORRCORR_HANDLER: PRINT 'ERROR' PRINT @@ERROR PRINT @@TRANCOUNT ROLLBACK TRANSACTION GET_NEXT_CORRI would like to know why i keep getting an error that ROLLBACK has not the proper BEGIN TRAN...What am i missing there?? |
|
tkizer
Almighty SQL Goddess
38200 Posts |
Posted - 2013-10-24 : 12:29:23
|
Because it's hitting the rollback tran regardless. If this is for a stored procedure, add RETURN after the COMMIT so it never hits the rollback code section. Otherwise you'll need to add an IF to the CORR_HANDLER section.Tara KizerSQL Server MVP since 2007http://weblogs.sqlteam.com/tarad/ |
|
|
JavierVera
Starting Member
4 Posts |
Posted - 2013-10-24 : 12:48:33
|
Thanks, you made me realize how this works at least...I wonder why keeps inserting when i get an error???? it shouldnt be on the rollback point and undo the inwsert??? |
|
|
tkizer
Almighty SQL Goddess
38200 Posts |
Posted - 2013-10-24 : 13:15:23
|
Are you referring to the ROLLBACK error? That error occurs after the insert/commit...Tara KizerSQL Server MVP since 2007http://weblogs.sqlteam.com/tarad/ |
|
|
JavierVera
Starting Member
4 Posts |
Posted - 2013-10-24 : 16:58:51
|
I think i didnt make myself clear but its fine, i was referring to the atomicity of my transaction. I ensure this function with the @@ERROR variable. |
|
|
tkizer
Almighty SQL Goddess
38200 Posts |
Posted - 2013-10-24 : 17:03:01
|
You need to store the value of @@ERROR into a variable and use that inside CORR_HANDLER as you are resetting @@ERROR with your PRINT messages after the inserts.Tara KizerSQL Server MVP since 2007http://weblogs.sqlteam.com/tarad/ |
|
|
JavierVera
Starting Member
4 Posts |
Posted - 2013-10-25 : 15:52:18
|
yup, thanks. heres the snippet wich i use to keep a sort of control:DECLARE @ErrorCode INTDECLARE @RowsAffected INTUPDATE TABLE SET FIELD = A WHERE = B -- <<<< After each possible cause of error i update the variables value SET @ErrorCode = @@ERROR -- <<<< After each possible cause of error i update the variables value SET @RowsAffected = @@ROWCOUNT -- <<<< After each possible cause of error i update the variables value IF(@ErrorCode <> 0) BEGIN GOTO TRX_HANDLERENDELSE IF(@RowsAffected > 0) BEGIN SET @piCantCerr = @piCantCerr +1END |
|
|
|
|
|