Zdrojové kódy pro vývojáře.
Přeskočit odkazy pro navigaci Top 10 přispěvatelů
UživatelČlánky
codeshare45
sochor1
stoupa1
tomas.oplt15
Článek: Zpracování výjimek v TSQL
Špatný Super
Autor:
Vytvořeno:
Popularita:

Pro následující příklady si vytvoříme testovací tabulku:

CREATE TABLE test 
(
testid int IDENTITY PRIMARY KEY,
descr varchar(10)
)
GO

Ve většině případů je třeba provést všechny příkazy v jedné transakci,
Pokud provedeme následující TSQL skript, druhý insert selže a aplikace dál provádí další řádek programu. 


BEGIN TRANSACTION 

-- Tento příkaz je validní
INSERT INTO test(descr) VALUES('1')

-- Provedení tohoto příkazu selže
INSERT INTO test(testid, descr) VALUES(2, '2')

-- Tento příkaz je validní
INSERT INTO test(descr) VALUES('3')

COMMIT TRANSACTION
Problém lze řešit následovně:

1) Po každém vykonání příkazu je nutné sledovat hodnoty proměnných
@@ERROR - v případě chyby obsahuje nenulový kód chyby
@@ROWCOUNT - obsahuje počet ovlivněných řádků posledním příkazem

Příklad správně napsaného skriptu:

DROP PROCEDURE TestProc 
GO
CREATE PROCEDURE TestProc
AS
BEGIN TRANSACTION

-- Tento příkaz je validní
INSERT INTO test(descr) VALUES('1')
IF (@@error<>0) OR (@@rowcount<>1) GOTO on_error

-- Provedení tohoto příkazu selže
INSERT INTO test(testid, descr) VALUES(2, '2')
IF (@@error<>0) OR (@@rowcount<>1) GOTO on_error

-- Tento příkaz je validní
INSERT INTO test(descr) VALUES('3')
IF (@@error<>0) OR (@@rowcount<>1) GOTO on_error

COMMIT TRANSACTION
RETURN (0)

on_error:
ROLLBACK TRANSACTION
RETURN (1)
GO

2) Nebo lze SQL Server přinutit vrácení všech transakcí nastavením SET XACT_ABORT ON

DROP PROCEDURE TestProc 
GO
CREATE PROCEDURE TestProc
AS

SET XACT_ABORT ON
BEGIN TRANSACTION

-- Tento příkaz je validní
INSERT INTO test(descr) VALUES('1')

-- Provedení tohoto příkazu selže
INSERT INTO test(testid, descr) VALUES(2, '2')

-- Tento příkaz je validní
INSERT INTO test(descr) VALUES('3')

COMMIT TRANSACTION
RETURN (0)

GO
3) Nebo lze použít konstrukci BEGIN TRY, END TRY ( pouze SQL Server 2005 )
DROP PROCEDURE TestProc 
GO
CREATE PROCEDURE TestProc
AS

BEGIN TRANSACTION

BEGIN TRY
-- Tento příkaz je validní
INSERT INTO test(descr) VALUES('1')
-- Provedení tohoto příkazu selže

INSERT INTO test(testid, descr) VALUES(2, '2')
-- Tento příkaz je validní
INSERT INTO test(descr) VALUES('3')
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_PROCEDURE() as ErrorProcedure,
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;

IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0
COMMIT TRANSACTION;

GO
  Na stránku 
screen  Nový příspěvek
Název  Uživatel  Datum 
Poslední návštěva: 17:37:29, 21. září 2017 První  Předchozí  0 Záznamů  Další  Poslední  

Autor článku
Jméno
Pracovní pozice
Informace
Foto

   

Počet návštěvníků:1
 
  Kontakt