1.ã¯ããã«
ãã®èšäºã¯ãSQL Serverã®ãšã©ãŒåŠçãšãã©ã³ã¶ã¯ã·ã§ã³åŠçã«é¢ããäžé£ã®3ã€ã®èšäºã®æåã®èšäºã§ãã ãã®ç®æšã¯ãã»ãšãã©ã®ã³ãŒãã«é©ããåºæ¬çãªäŸã瀺ãããšã«ããããšã©ãŒåŠçã®äž»é¡ã«ã€ããŠã¯ã€ãã¯ã¹ã¿ãŒããæäŸããããšã§ãã ãã®ããŒãã¯ãçµéšã®æµ ãèªè åãã«æžããããã®ã§ãããã®ãããå€ãã®è©³çŽ°ã«ã€ããŠã¯æ éã«é»ã£ãŠããŸãã çŸæç¹ã§ã®ã¿ã¹ã¯ã¯ã çç±ã匷調ããã«æ¹æ³ãäŒããããšã§ãã ããªããä¿¡ä»°ã«ã€ããŠç§ã®èšèãä¿¡ãããªããããªãã¯ãã®ããŒããèªãã§ãããªãã®ãã£ãªã¢ã®ãããªãã¹ãããã®ããã«ä»ã®2ã€ã延æããããšãã§ããŸãã
äžæ¹ãç§ã®æšå¥šäºé ã«çåãããå Žåã¯ãä»ã®2ã€ã®éšåãèªãå¿ èŠããããŸããSQLServerã®ãšã©ãŒãšãã©ã³ã¶ã¯ã·ã§ã³åŠçã®éåžžã«çŽããããäžçãæ¢ããªããã詳现ãããã«æ·±ãæãäžããŸãã 2çªç®ãš3çªç®ã®éšåãããã³3ã€ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãããæ·±ãçµéšãæã€èªè ã察象ãšããŠããŸãã æåã®èšäºã¯çãã2çªç®ãš3çªç®ã¯ã¯ããã«é·ãã§ãã
ãã¹ãŠã®èšäºã§ã¯ãããŒãžã§ã³2005以éã®SQL Serverã§ã®ãšã©ãŒããã³ãã©ã³ã¶ã¯ã·ã§ã³åŠçã«ã€ããŠèª¬æããŠããŸãã
1.1ãªããšã©ãŒåŠçãå¿ èŠãªã®ã§ããïŒ
ã³ãŒãã®ãšã©ãŒãåŠçããã®ã¯ãªãã§ããïŒ ããã«ã¯å€ãã®çç±ããããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®ãã©ãŒã ã§ã¯ãå ¥åãããããŒã¿ã確èªããå ¥åäžã«ç¯ããééãã«ã€ããŠãŠãŒã¶ãŒã«éç¥ããŸãã ãŠãŒã¶ãŒãšã©ãŒã¯äºæž¬å¯èœãªãšã©ãŒã§ãã ãããã äºæããªããšã©ãŒãåŠçããå¿ èŠããããŸãã ã€ãŸããã³ãŒããæžããšãã«äœããèŠèœãšãããšããäºå®ãåå ã§ãšã©ãŒãçºçããå¯èœæ§ããããŸãã ç°¡åãªã¢ãããŒãã¯ãå®è¡ãäžæããããå°ãªããšãäœãèµ·ããŠããããå®å šã«å¶åŸ¡ã§ãã段éã«æ»ãããšã§ãã äºæããªããšã©ãŒãç¡èŠããããšã¯å®å šã«å®¹èªã§ããªãããšãåã«åŒ·èª¿ããã ãã§ã¯ååã§ã¯ãããŸããã ããã¯æ²æšãªçµæãåŒãèµ·ããå¯èœæ§ãããæ¬ é¥ã§ããããšãã°ãã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã«èª€ã£ãæ å ±ãæäŸããããããã«æªãããšã«ãããŒã¿ããŒã¹ã«èª€ã£ãããŒã¿ãä¿åãããããå¯èœæ§ããããŸãã ãŸãããŠãŒã¶ãŒãæäœãæåãããšã¯æããªãããã«ãšã©ãŒãå ±åããããšãéèŠã§ãããã³ãŒãã¯å®éã«ã¯äœãããŸããã§ããã
å€ãã®å ŽåãããŒã¿ããŒã¹ã®å€æŽã¯ã¢ãããã¯ã«ãããã§ãã ããšãã°ãããã¢ã«ãŠã³ãããå¥ã®ã¢ã«ãŠã³ãã«ééããã¿ã¹ã¯ã ãã®ãããCashHoldingsããŒãã«ã®2ã€ã®ãšã³ããªãå€æŽããTransactionsããŒãã«ã«2ã€ã®ãšã³ããªãè¿œå ããå¿ èŠããããŸãã ãšã©ãŒã倱æããéãåå人ã®å£åº§ã«ééããããšããäºå®ã«è³ããããããå·®åºäººã®å£åº§ããåŒãèœãšãããããšã¯çµ¶å¯Ÿã«èš±ãããŸããã ãã®ããããšã©ãŒåŠçã¯ãã©ã³ã¶ã¯ã·ã§ã³åŠçã«ãé©çšãããŸãã äžèšã®äŸã§ã¯ãBEGIN TRANSACTIONããã³COMMIT TRANSACTIONã§æäœãã©ããããå¿ èŠããããŸãããããã ãã§ã¯ãããŸããããšã©ãŒãçºçããå Žåããã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ãããããšã確èªããå¿ èŠããããŸãã
2.åºæ¬ããŒã
ãŸãããšã©ãŒãåŠçããããã«å¿ èŠãªæãéèŠãªã³ãã³ãã確èªããŸãã 2çªç®ã®éšåã§ã¯ããšã©ãŒããã³ãã©ã³ã¶ã¯ã·ã§ã³åŠçã«é¢é£ãããã¹ãŠã®ã³ãã³ãã«ã€ããŠèª¬æããŸãã
2.1ãã©ã€ãã£ãã
äž»ãªãšã©ãŒåŠçã¡ã«ããºã ã¯TRY-CATCHã³ã³ã¹ãã©ã¯ãã§ãããä»ã®èšèªã®åæ§ã®ã³ã³ã¹ãã©ã¯ããéåžžã«é£æ³ãããŸãã æ§é ã¯æ¬¡ã®ãšããã§ãã
BEGIN TRY < > END TRY BEGIN CATCH < > END CATCH
< >
ã«ãšã©ãŒã衚瀺ãããå Žåãå®è¡ã¯CATCHãããã¯ã«è»¢éããããšã©ãŒåŠçã³ãŒããå®è¡ãããŸãã
éåžžãCATCHã¯éããŠãããã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ãããšã©ãŒãåçæããŸãã ãããã£ãŠãåŒã³åºãå ã®ã¯ã©ã€ã¢ã³ãã¯ãäœããããŸããããªãã£ãããšãç解ããŸãã ãšã©ãŒã®ãªã³ãŒã«ã«ã€ããŠã¯ããã®èšäºã®åŸåã§èª¬æããŸãã
éåžžã«ç°¡åãªäŸã次ã«ç€ºããŸãã
BEGIN TRY DECLARE @x int SELECT @x = 1/0 PRINT 'Not reached' END TRY BEGIN CATCH PRINT 'This is the error: ' + error_message() END CATCH
å®è¡çµæïŒ
This is the error: Divide by zero error encountered.
åŸã§error_messageïŒïŒé¢æ°ã«æ»ããŸãã CATCHãã³ãã©ãŒã§ã®PRINTã®äœ¿çšã¯ãå®éšã®äžéšãšããŠã®ã¿æäŸãããŠãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ã¯å®è¡ããªãã§ãã ããã
< >
ãã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºãããããªã¬ãŒãããªã¬ãŒããå Žåããããã§çºçãããšã©ãŒã¯å®è¡ãCATCHãããã¯ã«æž¡ããŸãã å ·äœçã«ã¯ããšã©ãŒãçºçãããšãSQL Serverã¯CATCHãã³ãã©ãŒãèŠã€ãããŸã§ã¹ã¿ãã¯ãã¹ãã³ããŸãã ãã®ãããªãã³ãã©ãŒããªãå ŽåãSQL Serverã¯ãšã©ãŒã¡ãã»ãŒãžãã¯ã©ã€ã¢ã³ãã«çŽæ¥éä¿¡ããŸãã
TRY-CATCHæ§é ã«ã¯ãç¥ã£ãŠããå¿ èŠã®ããéåžžã«éèŠãªå¶éã1ã€ãããŸããåãã¹ã³ãŒãã§çºçããã³ã³ãã€ã«ãšã©ãŒããã£ããããŸããã äŸãèããŠã¿ãŸãããïŒ
CREATE PROCEDURE inner_sp AS BEGIN TRY PRINT 'This prints' SELECT * FROM NoSuchTable PRINT 'This does not print' END TRY BEGIN CATCH PRINT 'And nor does this print' END CATCH go EXEC inner_sp
åºåããŒã¿ïŒ
This prints Msg 208, Level 16, State 1, Procedure inner_sp, Line 4 Invalid object name 'NoSuchTable'
ã芧ã®ãšãããTRYãããã¯ã¯ååšããŸããããšã©ãŒãçºçãããšãæåŸ ã©ããã«å®è¡ãCATCHãããã¯ã«æž¡ãããŸããã ããã¯ãå®è¡æã«çºçããåã®æ¬ èœãç¡å¹ãªãšã€ãªã¢ã¹ãªã©ã®ãã¹ãŠã®ã³ã³ãã€ã«ãšã©ãŒã«é©çšãããŸãã ïŒé 延åå解決-ååšããªãããŒãã«ã«ã¢ã¯ã»ã¹ããããã·ãŒãžã£ãSQL Serverãäœæã§ããããã«ããæ©èœã«ãããå®è¡æã«SQL Serverã§ã³ã³ãã€ã«ãšã©ãŒãçºçããå¯èœæ§ããããŸããïŒ
ãããã®ãšã©ãŒã¯å®å šã«ãšããã©ããã®ãªããã®ã§ã¯ãããŸããã ããããçºçãããšãªã¢ã§ã¯æãŸããããŸããããå€éšãšãªã¢ã§ã¯æãŸããããŸãã ãã®ã³ãŒããåã®äŸã«è¿œå ããŸãã
CREATE PROCEDURE outer_sp AS BEGIN TRY EXEC inner_sp END TRY BEGIN CATCH PRINT 'The error message is: ' + error_message() END CATCH go EXEC outer_sp
次ã®åºåãåŸãããŸãã
This prints The error message is: Invalid object name 'NoSuchTable'.
ä»åã¯ãå€éšCATCHãã³ãã©ãŒãæ©èœããããããšã©ãŒããã£ãããããŸããã
2.2 SET XACT_ABORT ON
åžžã«ããã®åŒãã¹ãã¢ãããã·ãŒãžã£ã®å é ã«è¿œå ããŸãã
SET XACT_ABORT, NOCOUNT ON
以åã®ããŒãžã§ã³ãšã®äºææ§ã®ããã«ããã©ã«ãã§ãªãã«ãªã£ãŠãã2ã€ã®ã»ãã·ã§ã³ãã©ã¡ãŒã¿ãŒãã¢ã¯ãã£ãã«ããŸãããçµéšäžããããã®ãã©ã¡ãŒã¿ãŒãåžžã«ãªã³ã«ããããšãæåã®ã¢ãããŒãã§ããããšã蚌æãããŠããŸãã TRY-CATCHã䜿çšããªãå Žåã®SQL Serverã®ããã©ã«ãã®åäœã§ã¯ãäžéšã®ãšã©ãŒã¯å®è¡ãäžæããéããŠãããã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ããŸãããä»ã®ãšã©ãŒã§ã¯åŸç¶ã®åœä»€ã®å®è¡ã¯ç¶ç¶ããŸãã XACT_ABORT ONãæå¹ã«ãããšãã»ãšãã©ãã¹ãŠã®ãšã©ãŒãåãå¹æãåŒãèµ·ããå§ããŸããéããŠãããã©ã³ã¶ã¯ã·ã§ã³ã¯ãã¹ãŠããŒã«ããã¯ãããã³ãŒãã®å®è¡ã¯äžæãããŸãã ããã€ãã®äŸå€ããããŸããããã®äžã§æã泚ç®ãã¹ãã¯åŒRAISERRORã§ãã
XACT_ABORTãã©ã¡ãŒã¿ãŒã¯ãããä¿¡é Œæ§ã®é«ããšã©ãŒããã³ãã©ã³ã¶ã¯ã·ã§ã³åŠçã®ããã«å¿ èŠã§ãã ç¹ã«ãããã©ã«ãèšå®ã§ã¯ãTRY-CATCHã䜿çšããŠããå Žåã§ãããã©ã³ã¶ã¯ã·ã§ã³ã®ããŒã«ããã¯ãªãã§å®è¡ãäžæ¢ã§ããç¶æ³ãããã€ããããŸãã åã®ã»ã¯ã·ã§ã³ã§ãã®ãããªäŸãã¿ãŸããããTRY-CATCHã¯åãé åã§çºçããã³ã³ãã€ã«ãšã©ãŒããã£ããããªãããšãããããŸããã ãšã©ãŒã®ããã«ããŒã«ããã¯ãããªãã£ããªãŒãã³ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ããã©ã³ã¶ã¯ã·ã§ã³ãå®äºãŸãã¯ããŒã«ããã¯ããã«å®è¡ãç¶ç¶ããå Žåãé倧ãªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
SQL Serverã§ä¿¡é Œæ§ã®é«ããšã©ãŒåŠçãè¡ãã«ã¯ãTRY-CATCHãšSET XACT_ABORT ONã®äž¡æ¹ãå¿ èŠã§ãã äžã§ããSET XACT_ABORT ONã¹ããŒãã¡ã³ããæãéèŠã§ãã ç£æ¥ç°å¢ã§ã³ãŒãã ãã«é Œãã¹ãã§ã¯ãªãå Žåãè¿ éã§ç°¡åãªãœãªã¥ãŒã·ã§ã³ã«éåžžã«é©ããŠããŸãã
NOCOUNTãã©ã¡ãŒã¿ãŒã¯ãšã©ãŒåŠçãšã¯é¢ä¿ãããŸããããã³ãŒãã«å«ããããšããå§ãããŸãã NOCOUNTã¯ãSQL Server Management Studioã®[ã¡ãã»ãŒãž]ããã«ã«è¡šç€ºããã圢åŒïŒåœ±é¿ãåãã1è¡ïŒã®ã¡ãã»ãŒãžãæå¶ããŸãã ãããã®ã¡ãã»ãŒãžã¯SSMSã䜿çšããå Žåã«åœ¹ç«ã¡ãŸããããããã¯ãŒã¯ãã©ãã£ãã¯ãå¢å ãããããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸãã è¡æ°ã«é¢ããã¡ãã»ãŒãžã¯ãèšè¿°ãäžååãªã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã§ããšã©ãŒãåŒãèµ·ããå¯èœæ§ããããããã¯ãªã¯ãšã¹ããè¿ããããŒã¿ã§ãããšèããå ŽåããããŸãã
äžèšã§ã¯ãå°ãçããæ§æã䜿çšããŸããã ã»ãšãã©ã®äººã¯ã2ã€ã®å¥åã®åŒãèšè¿°ããŸãã
SET NOCOUNT ON SET XACT_ABORT ON
ãããã®éã«éãã¯ãããŸããã ç§ã¯SETãšã«ã³ãä»ãã®ããŒãžã§ã³ã奜ãã§ãããªããªã ããã«ãããã³ãŒããã€ãºãæžå°ããŸãã ãããã®åŒã¯ãã¹ãŠã®ã¹ãã¢ãããã·ãŒãžã£ã«è¡šç€ºãããããã䜿çšããã¹ããŒã¹ã¯ã§ããéãå°ãªãããå¿ èŠããããŸãã
3.ãšã©ãŒåŠçã®äž»ãªäŸ
TRY-CATCHãšSET XACT_ABORT ONã確èªããåŸããã¹ãŠã®ã¹ãã¢ãããã·ãŒãžã£ã§äœ¿çšã§ããäŸã«ãŸãšããŸãããã æåã«ããšã©ãŒãåçŽãªåœ¢åŒã§çæãããäŸã瀺ããŸãã次ã®ã»ã¯ã·ã§ã³ã§ã¯ãããè¯ã解決çã«ã€ããŠèª¬æããŸãã
äŸãšããŠããã®åçŽãªããŒãã«ã䜿çšããŸãã
CREATE TABLE sometable(a int NOT NULL, b int NOT NULL, CONSTRAINT pk_sometable PRIMARY KEY(a, b))
ãšã©ãŒãšãã©ã³ã¶ã¯ã·ã§ã³ã®åŠçæ¹æ³ã瀺ãã¹ãã¢ãããã·ãŒãžã£ã次ã«ç€ºããŸãã
CREATE PROCEDURE insert_data @a int, @b int AS SET XACT_ABORT, NOCOUNT ON BEGIN TRY BEGIN TRANSACTION INSERT sometable(a, b) VALUES (@a, @b) INSERT sometable(a, b) VALUES (@b, @a) COMMIT TRANSACTION END TRY BEGIN CATCH IF @@trancount > 0 ROLLBACK TRANSACTION DECLARE @msg nvarchar(2048) = error_message() RAISERROR (@msg, 16, 1) RETURN 55555 END CATCH
äžèšã§ç€ºããããã«ãæé ã®æåã®è¡ã«ã¯ã1ã€ã®åŒã«XACT_ABORTãšNOCOUNTãå«ãŸããŠããŸãã ãã®è¡ã¯ãBEGIN TRYã®åã®å¯äžã®è¡ã§ãã ããã·ãŒãžã£å ã®ä»ã®ãã¹ãŠã¯ãBEGIN TRYã®åŸã«é 眮ããå¿ èŠããããŸããå€æ°ã®å®£èšãäžæããŒãã«ã®äœæãããŒãã«å€æ°ãããã ãã§ãã æé ã«ä»ã®SETã³ãã³ããããå Žåã§ãïŒãã®çç±ã¯ãŸãã§ããïŒãBEGIN TRYã®åŸã«æ¥ãå¿ èŠããããŸãã
BEGIN TRYã®åã«SET XACT_ABORTãšNOCOUNTãæå®ããããšã奜ãçç±ã¯ãããã1è¡ã®ãã€ãºãšããŠèŠãŠããããã§ããåžžã«ååšããã¯ãã§ãããèŠãç®ãä¹±ããããªãã®ã§ãã ãã¡ãããããã¯å¥œã¿ã®åé¡ã§ãããBEGIN TRYã®åŸã«SETã³ãã³ããé 眮ããããšã奜ãå Žåãããã¯å€§äžå€«ã§ãã éèŠãªããšã¯ãBEGIN TRYã®åã«ä»ã®ãã®ã眮ããªãããšã§ãã
BEGIN TRYãšEND TRYã®éã®éšåãæé ã®äž»èŠéšåã§ãã ãŠãŒã¶ãŒå®çŸ©ã®ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšãããã£ãããããã¢ãæ¿å ¥ããå Žåã¯éã®ãã¢ãæ¿å ¥ããå¿ èŠããããšãããããªãå åããããããžãã¹ã«ãŒã«ãå°å ¥ããŸããã 2ã€ã®INSERTã¹ããŒãã¡ã³ãã¯ãBEGINããã³COMMIT TRANSACTIONå ã«ãããŸãã å€ãã®å ŽåãBEGIN TRYãšBEGIN TRANSACTIONã®éã«å€ãã®ã³ãŒãè¡ããããŸãã ãŸããCOMMIT TRANSACTIONãšEND TRYã®éã«ã³ãŒããããå ŽåããããŸãããããã¯éåžžãæçµçãªSELECTã§ãããããŒã¿ãè¿ãããåºåãã©ã¡ãŒã¿ãŒã«å€ãå²ãåœãŠãŸãã ããã·ãŒãžã£ãå€æŽãå ããªãå ŽåããŸãã¯INSERT / UPDATE / DELETE / MERGEåŒã1ã€ã ãã®å Žåãéåžžããã©ã³ã¶ã¯ã·ã§ã³ãæ瀺çã«æå®ããå¿ èŠã¯ãããŸããã
TRYãããã¯ã¯æé ããšã«ç°ãªãããã«èŠããŸãããCATCHãããã¯ã¯ã³ããŒã¢ã³ãããŒã¹ãã®çµæãå€å°ç°ãªããŸãã ã€ãŸããçãç°¡åãªããšãããŠãããèããããã«ã©ãã§ã䜿çšããŸãã äžèšã®CATCHãã³ãã©ãŒã¯3ã€ã®ããšãè¡ããŸãã
- éããŠãããã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ããŸãã
- ãšã©ãŒãååŒãèµ·ãããŸãã
- ããã·ãŒãžã£ã«ãã£ãŠè¿ãããå€ããŒã以å€ã§ããããšã確èªããŸãã
ãããã®3ã€ã®ã¢ã¯ã·ã§ã³ã¯åžžã«ååšããå¿ èŠããããŸãã ç§ãã¡ã¯ãã®ã©ã€ã³ã«å察ããããšãã§ããŸã
IF @@trancount > 0 ROLLBACK TRANSACTION
ããã·ãŒãžã£ã«æ瀺çãªãã©ã³ã¶ã¯ã·ã§ã³ããªãå Žåã¯äžèŠã§ãããããã¯çµ¶å¯Ÿã«ééã£ãŠããŸãã ããããããã©ã³ã¶ã¯ã·ã§ã³ãéãã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºããŠããŸãããTRY-CATCHã®å¶éã®ããã«ãã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ã§ããŸããã ãããããããªããä»ã®èª°ãã2幎以å ã«æ瀺çãªãã©ã³ã¶ã¯ã·ã§ã³ãè¿œå ããã§ãããã ãã®å ŽåãããŒã«ããã¯ä»ãã®è¡ãè¿œå ããå¿ èŠãããããšãèŠããŠããŸããïŒ ããã«é Œããªãã§ãã ããã ãŸããããã·ãŒãžã£ãåŒã³åºã人ããã©ã³ã¶ã¯ã·ã§ã³ãéããå Žåããã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ããŠã¯ãªããªãããšã«å察ããèªè ã®å£°ãèããŸãããããããããã¹ãã§ããçç±ãç¥ãããå Žåã¯ã2çªç®ãš3çªç®ã®éšåãèªãå¿ èŠããããŸãã CATCHãã³ãã©ãŒã§ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®ããŒã«ããã¯ã¯ãäŸå€ã®ãªã絶察çãªåœä»€ã§ãã
ãšã©ãŒåçæã³ãŒãã«ã¯æ¬¡ã®è¡ãå«ãŸããŸãã
DECLARE @msg nvarchar(2048) = error_message()
çµã¿èŸŒã¿ã®error_messageïŒïŒé¢æ°ã¯ãçºçãããšã©ãŒã®ããã¹ããè¿ããŸãã 次ã®è¡ã§ã¯ãRAISERRORåŒã䜿çšããŠãšã©ãŒãåŒã³åºãããŸãã ããã¯ãšã©ãŒãçºçãããæãç°¡åãªæ¹æ³ã§ã¯ãããŸããããæ©èœããŸãã ä»ã®æ¹æ³ã«ã€ããŠã¯ã次ã®ç« ã§èª¬æããŸãã
泚 ïŒDECLAREã§å€æ°ãåæåããæ§æã¯ãSQL Server 2008ã§å°å ¥ãããŸãããSQLServer 2005ã䜿çšããŠããå Žåã¯ãæååãDECLAREãšSELECTã¹ããŒãã¡ã³ãã«åå²ããå¿ èŠããããŸãã
RETURNã®æåŸã®è¡šçŸã¯ä¿éºã§ãã RAISERRORã¯äžæ¢ãããããšã¯ãªãããã次ã®ã¹ããŒãã¡ã³ãã¯ç¶è¡ãããŸãã ãã¹ãŠã®æé ãTRY-CATCHã䜿çšãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã³ãŒããäŸå€ãåŠçããŸãããå¿é ããå¿ èŠã¯ãããŸããã ãã ããSQL Server 2005以åããã³TRY-CATCHå®è£ åã«èšè¿°ãããå€ãã³ãŒãããããã·ãŒãžã£ãåŒã³åºãããšãã§ããŸãã åœæãã§ããããšã¯æ»ãå€ãèŠãããšã§ããã RETURNã§è¿ãããå€ã¯ãnullå€ã§ãªãå Žåã¯å®éã«ã¯åé¡ã«ãªããŸããïŒéåžžããŒãã¯æ£åžžãªã·ã£ããããŠã³ã瀺ããŸãïŒã
ããã·ãŒãžã£ã®æåŸã®åŒã¯END CATCHã§ãã END CATCHã®åŸã«ã³ãŒããé 眮ããªãã§ãã ããã æé ãèªãã§ãã人ã«ã¯ããã®ã³ãŒãã衚瀺ãããªãå ŽåããããŸãã
çè«ãèªãã åŸããã¹ãã±ãŒã¹ãè©ŠããŠã¿ãŸãããïŒ
EXEC insert_data 9, NULL
å®è¡çµæïŒ
Msg 50000, Level 16, State 1, Procedure insert_data, Line 12 Cannot insert the value NULL into column 'b', table 'tempdb.dbo.sometable'; column does not allow nulls. INSERT fails.
å€éšããã·ãŒãžã£ãè¿œå ããŠããšã©ãŒãå床åŒã³åºããããšãã«äœãèµ·ããããèŠãŠã¿ãŸãããã
CREATE PROCEDURE outer_sp @a int, @b int AS SET XACT_ABORT, NOCOUNT ON BEGIN TRY EXEC insert_data @a, @b END TRY BEGIN CATCH IF @@trancount > 0 ROLLBACK TRANSACTION DECLARE @msg nvarchar(2048) = error_message() RAISERROR (@msg, 16, 1) RETURN 55555 END CATCH go EXEC outer_sp 8, 8
ä»äºã®çµæïŒ
Msg 50000, Level 16, State 1, Procedure outer_sp, Line 9 Violation of PRIMARY KEY constraint 'pk_sometable'. Cannot insert duplicate key in object 'dbo.sometable'. The duplicate key value is (8, 8).
æ£ãããšã©ãŒã¡ãã»ãŒãžãåãåããŸãããããã®ã¡ãã»ãŒãžã®ããããŒãšåã®ããããŒãèŠããšãåé¡ã«æ°ä»ãå ŽåããããŸãã
Msg 50000, Level 16, State 1, Procedure insert_data, Line 12 Msg 50000, Level 16, State 1, Procedure outer_sp, Line 9
ãšã©ãŒã¡ãã»ãŒãžã«ã¯ãæçµçãªRAISERRORåŒã®å Žæã衚瀺ãããŸãã æåã®ã±ãŒã¹ã§ã¯ãè¡çªå·ã®ã¿ãééã£ãŠããŸãã 2çªç®ã®ã±ãŒã¹ã§ã¯ãããã·ãŒãžã£åãæ£ãããããŸããã ãã¹ãã±ãŒã¹ã®ãããªç°¡åãªæé ã§ã¯ãããã¯å€§ããªåé¡ã§ã¯ãããŸããã ãã ãããã¹ããããè€éãªããã·ãŒãžã£ã®ã¬ãã«ãè€æ°ããå Žåããšã©ãŒã®çºçå Žæã瀺ãããŠããªããšã©ãŒã¡ãã»ãŒãžããããšããšã©ãŒã®æ€åºãšä¿®æ£ãã¯ããã«å°é£ã«ãªããŸãã ãã®ããããšã©ãŒã³ãŒããã©ã°ã¡ã³ãã®å Žæããã°ããç¹å®ã§ããããã«ãšã©ãŒãçæããããšããå§ãããŸããããã¯æ¬¡ã®ç« ã§æ€èšããããšã§ãã
4.ãšã©ãŒãçæãã3ã€ã®æ¹æ³
4.1 error_handler_spã®äœ¿çš
ãšã©ãŒã¡ãã»ãŒãžã®ããã¹ããè¿ãerror_messageïŒïŒé¢æ°ãèŠãŸããã ãšã©ãŒã¡ãã»ãŒãžã¯ããã€ãã®ã³ã³ããŒãã³ãã§æ§æãããããããã«ç¬èªã®é¢æ°error_xxxïŒïŒããããŸãã ãããã䜿çšããŠãå ã®æ å ±ãå«ãå®å šãªã¡ãã»ãŒãžãåçæã§ããŸããã圢åŒã¯ç°ãªããŸãã ãã¹ãŠã®CATCHãã³ãã©ã§ãããè¡ããšãã³ãŒãã®éè€ãšãã倧ããªæ¬ ç¹ã«ãªããŸãã error_messageïŒïŒããã³ä»ã®åæ§ã®é¢æ°ãåŒã³åºãããã«CATCHãããã¯ã«ããå¿ èŠã¯ãªããCATCHãããã¯ãå®è¡ããã¹ãã¢ãããã·ãŒãžã£ããåŒã³åºãããå Žåãåãæ å ±ãè¿ããŸãã
error_handler_spã玹ä»ããŸãã
CREATE PROCEDURE error_handler_sp AS DECLARE @errmsg nvarchar(2048), @severity tinyint, @state tinyint, @errno int, @proc sysname, @lineno int SELECT @errmsg = error_message(), @severity = error_severity(), @state = error_state(), @errno = error_number(), @proc = error_procedure(), @lineno = error_line() IF @errmsg NOT LIKE '***%' BEGIN SELECT @errmsg = '*** ' + coalesce(quotename(@proc), '<dynamic SQL>') + ', Line ' + ltrim(str(@lineno)) + '. Errno ' + ltrim(str(@errno)) + ': ' + @errmsg END RAISERROR('%s', @severity, @state, @errmsg)
error_handler_spã®æåã®æ©èœã¯ããã¹ãŠã®error_xxxïŒïŒé¢æ°ã®å€ãããŒã«ã«å€æ°ã«ä¿åããããšã§ãã ããã«åŒIFã«æ»ããŸãã 代ããã«ãIFå ã®SELECTã¹ããŒãã¡ã³ããèŠãŠã¿ãŸãããã
SELECT @errmsg = '*** ' + coalesce(quotename(@proc), '<dynamic SQL>') + ', Line ' + ltrim(str(@lineno)) + '. Errno ' + ltrim(str(@errno)) + ': ' + @errmsg
ãã®SELECTã®ç®çã¯ãRAISERRORã«æž¡ããããšã©ãŒã¡ãã»ãŒãžããã©ãŒãããããããšã§ãã ããã«ã¯ãå ã®ãšã©ãŒã¡ãã»ãŒãžããã®ãã¹ãŠã®æ å ±ãå«ãŸããŠãããRAISERRORã«çŽæ¥æ¿å ¥ããããšã¯ã§ããŸããã ããã·ãŒãžã£åãåŠçããå¿ èŠããããŸãããéåžžã®ã¹ã¯ãªãããŸãã¯åçSQLã®ãšã©ãŒã®å Žåã¯NULLã«ãªãå ŽåããããŸãã ãããã£ãŠãCOALESCEé¢æ°ã䜿çšãããŸãã ïŒåŒRAISERRORã®åœ¢åŒãããããªãå Žåã¯ã第2éšã§è©³ãã説æããŸããïŒ
ãã©ãŒãããããããšã©ãŒã¡ãã»ãŒãžã¯ã3ã€ã®ã¢ã¹ã¿ãªã¹ã¯ã§å§ãŸããŸãã ããã«ããã2ã€ã®ç®æšãéæãããŸãã1ïŒãã®ã¡ãã»ãŒãžãCATCHãã³ãã©ãŒããåŒã³åºãããããšãããã«ããããŸãã 2ïŒããã«ãããerror_handler_spãNOT LIKE '***ïŒ 'æ¡ä»¶ã䜿çšããŠæ¢ã«1å以äžçæããããšã©ãŒããã£ã«ã¿ãŒã§é€å€ããã¡ãã»ãŒãžã®2åç®ã®å€æŽãåé¿ã§ããŸãã
ããã¯ãerror_handler_spã䜿çšãããšãã«CATCHãã³ãã©ãŒãã©ã®ããã«èŠãããã§ãã
BEGIN CATCH IF @@trancount > 0 ROLLBACK TRANSACTION EXEC error_handler_sp RETURN 55555 END CATCH
ããã€ãã®ãã¹ãã±ãŒã¹ãè©ŠããŠã¿ãŸãããã
EXEC insert_data 8, NULL EXEC outer_sp 8, 8
å®è¡çµæïŒ
Msg 50000, Level 16, State 2, Procedure error_handler_sp, Line 20 *** [insert_data], Line 5. Errno 515: Cannot insert the value NULL into column 'b', table 'tempdb.dbo.sometable'; column does not allow nulls. INSERT fails. Msg 50000, Level 14, State 1, Procedure error_handler_sp, Line 20 *** [insert_data], Line 6. Errno 2627: Violation of PRIMARY KEY constraint 'pk_sometable'. Cannot insert duplicate key in object 'dbo.sometable'. The duplicate key value is (8, 8).
ã¡ãã»ãŒãžããããŒã¯ãerror_handler_spããã·ãŒãžã£ã§ãšã©ãŒãçºçããããšã瀺ããŠããŸããããšã©ãŒã¡ãã»ãŒãžã®ããã¹ãããããšã©ãŒã®å®éã®å ŽæïŒããã·ãŒãžã£ã®ååãšè¡çªå·ã®äž¡æ¹ïŒãããããŸãã
ãšã©ãŒãåŒã³åºããã2ã€ã®æ¹æ³ã玹ä»ããŸãã ãã ããerror_handler_spã¯ããã®éšåãèªãã§ããèªè ã«å¯Ÿããç§ã®äž»ãªæšå¥šäºé ã§ãã ããã¯ã2005幎以éãSQL Serverã®ãã¹ãŠã®ããŒãžã§ã³ã§å®è¡ãããŠããã·ã³ãã«ãªãªãã·ã§ã³ã§ããæ¬ ç¹ã¯1ã€ã ãã§ããå Žåã«ãã£ãŠã¯ãSQL Serverã2ã€ã®ãšã©ãŒã¡ãã»ãŒãžãçæããŸãããerror_xxxïŒïŒé¢æ°ã¯ãã®ãã¡ã®1ã€ã®ã¿ãè¿ããããã¡ãã»ãŒãžã®1ã€ã倱ãããŸãã ããã¯ãBACKUP \ RESTOREã®ãããªç®¡çã³ãã³ããæäœããå Žåã¯äžäŸ¿ãããããŸããããã¢ããªã±ãŒã·ã§ã³å°çšã«èšèšãããã³ãŒãã§ã¯åé¡ãã»ãšãã©çºçããŸããã
4.2ã 䜿çšæ³ãã¹ããŒ
SQL Server 2012ã§ãMicrosoftã¯åŒãå°å ¥ããŸãã;ãšã©ãŒåŠçã容æã«ããããã®THROWã æ®å¿µãªãããMicrosoftã¯ãã®ã³ãã³ãã®èšèšã«é倧ãªééããç¯ããå±éºãªtrapãäœæããŸããã
åŒ; THROWã§ã¯ãã¹ãã¢ãããã·ãŒãžã£ã¯å¿ èŠãããŸããã CATCHãã³ãã©ãŒã¯æ¬¡ã®ããã«ç°¡åã«ãªããŸãã
BEGIN CATCH IF @@trancount > 0 ROLLBACK TRANSACTION ;THROW RETURN 55555 END CATCH
å©ç¹ïŒTHROWã¯ããšã©ãŒã¡ãã»ãŒãžãå ã®ã¡ãã»ãŒãžãšãŸã£ããåãããã«çæãããããšã§ãã æåã«2ã€ã®ãšã©ãŒã¡ãã»ãŒãžããã£ãå Žåãäž¡æ¹ã®ã¡ãã»ãŒãžãåçŸãããããããã®è¡šçŸã¯ããã«é åçã§ãã ä»ã®ãã¹ãŠã®ãšã©ãŒã¡ãã»ãŒãžãšåæ§ã«ãTHROWã«ãã£ãŠçæããããšã©ãŒã¯ãå€éšCATCHãã³ãã©ãŒã«ãã£ãŠãã£ãããããåçŸãããŸãã CATCHãã³ãã©ããªãå Žåãå®è¡ã¯äžæ¢ãããããããã®å Žåã¯RETURNã¹ããŒãã¡ã³ãã¯å¿ èŠãããŸããã ïŒæ 床ãå€ããå Žåã«åããŠããã®ãŸãŸã«ããŠããããšããå§ãããŸããåŸã§æããŸãïŒã
SQL Server 2012以éã䜿çšããŠããå Žåã¯ãinsert_dataãšouter_spã®å®çŸ©ãå€æŽããŠããã¹ããåè©Šè¡ããŠãã ããã ä»åã®çµæã¯æ¬¡ã®ããã«ãªããŸãã
Msg 515, Level 16, State 2, Procedure insert_data, Line 5 Cannot insert the value NULL into column 'b', table 'tempdb.dbo.sometable'; column does not allow nulls. INSERT fails. Msg 2627, Level 14, State 1, Procedure insert_data, Line 6 Violation of PRIMARY KEY constraint 'pk_sometable'. Cannot insert duplicate key in object 'dbo.sometable'. The duplicate key value is (8, 8).
ããã·ãŒãžã£åãšè¡çªå·ã¯æ£ç¢ºã§ãããæ··ä¹±ãæãå¯èœæ§ã®ããä»ã®ããã·ãŒãžã£åã¯ãããŸããã å ã®ãšã©ãŒçªå·ãä¿åãããŸããã
ãã®æç¹ã§ãããªãã¯èªåèªèº«ã«èšãããšãã§ããŸãïŒMicrosoftã¯æ¬åœã«ã³ãã³ãã«ååãä»ããŸãããïŒ ããã¯ãã æããã ãã§ã¯ãããŸãããïŒ å®éãBooks OnlineãèŠããšãã»ãã³ãã³ã¯ãããŸããã ããããã»ãã³ãã³ã¯ãã¹ãã§ãã å ¬åŒã«ã¯ãåã®åŒãåºåããŸãããããã¯ãªãã·ã§ã³ã§ãããT-SQLåŒã§å šå¡ãã»ãã³ãã³ã䜿çšããããã§ã¯ãããŸããã ããã«éèŠãªããšã¯ãTHROWã®åã«ã»ãã³ãã³ãã¹ãããããå Žåãæ§æãšã©ãŒã¯çºçããªãããšã§ãã ããããããã¯åŒã®åäœã«åœ±é¿ãäžãããã®åäœã¯åå¿è ã«ã¯ç解ã§ããŸããã ã¢ã¯ãã£ããªãã©ã³ã¶ã¯ã·ã§ã³ãããå Žåãå ã®ãã©ã³ã¶ã¯ã·ã§ã³ãšã¯ãŸã£ããç°ãªããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã ããã«æªãããšã«ãã¢ã¯ãã£ããªãã©ã³ã¶ã¯ã·ã§ã³ããªãå Žåããšã©ãŒã¯åŠçããã«éãã«è¡šç€ºãããŸãã ã»ãã³ãã³ãã¹ããããããããªããšã¯ããã®ãããªã°ãããçµæããããããªãã¯ãã§ãã ãã®åäœã®ãªã¹ã¯ãæžããããã«ãã³ãã³ãã¯åžžã«THROWïŒã»ãã³ãã³ä»ãïŒãšèããŠãã ããã
ãããåŠå®ããããšã¯ãããŸãã; THROWã«ã¯å©ç¹ããããŸãããã»ãã³ãã³ããã®ã³ãã³ãã®å¯äžã®trapã§ã¯ãããŸããã 䜿çšãããå Žåã¯ãå°ãªããšããã®ã·ãªãŒãºã®ç¬¬2éšãèªãããšããå§ãããŸããããã§ã¯ãããŒã ã«é¢ãã詳现ãå ¬éããŸãã ãããŸã§ã¯ãerror_handler_spã䜿çšããŸãã
4.3ã SqlEventLogã®äœ¿çš
ãšã©ãŒãåŠçãã3çªç®ã®æ¹æ³ã¯ãSqlEventLogã䜿çšããããšã§ããããã«ã€ããŠã¯ã第3éšã§è©³ãã説æããŸãã ããã§ã¯ãçãã¬ãã¥ãŒã®ã¿ãè¡ããŸãã
SqlEventLogã¯ãã¹ãã¢ãããã·ãŒãžã£slog.catchhandler_spãæäŸããŸããããã¯ãerror_handler_spãšåãããã«æ©èœããŸããerror_xxxïŒïŒé¢æ°ã䜿çšããŠæ å ±ãåéãããšã©ãŒã¡ãã»ãŒãžã衚瀺ããŠãããã«é¢ãããã¹ãŠã®æ å ±ãä¿åããŸãã ããã«å ããŠãsplog.sqleventlogããŒãã«ã«ãšã©ãŒãèšé²ããŸãã 䜿çšããŠããã¢ããªã±ãŒã·ã§ã³ã®ã¿ã€ãã«ãã£ãŠã¯ããã®ããŒãã«ã¯éåžžã«äŸ¡å€ã®ãããªããžã§ã¯ãã«ãªãå¯èœæ§ããããŸãã
SqlEventLogã䜿çšããã«ã¯ãCATCHãã³ãã©ãŒã¯æ¬¡ã®ããã«ãªããŸãã
BEGIN CATCH IF @@trancount > 0 ROLLBACK TRANSACTION EXEC slog.catchhandler_sp @@procid RETURN 55555 END CATCH
@@ procidã¯ãçŸåšã®ã¹ãã¢ãããã·ãŒãžã£ã®ãªããžã§ã¯ãèå¥åãè¿ããŸãã ããã¯ãSqlEventLogãæ å ±ãããŒãã«ã«èšé²ããããã«äœ¿çšãããã®ã§ãã åããã¹ãã¹ã¯ãªããã䜿çšããŠãcatchhandler_spã䜿çšããŠäœæ¥ã®çµæãååŸããŸãã
Msg 50000, Level 16, State 2, Procedure catchhandler_sp, Line 125 {515} Procedure insert_data, Line 5 Cannot insert the value NULL into column 'b', table 'tempdb.dbo.sometable'; column does not allow nulls. INSERT fails. Msg 50000, Level 14, State 1, Procedure catchhandler_sp, Line 125 {2627} Procedure insert_data, Line 6 Violation of PRIMARY KEY constraint 'pk_sometable'. Cannot insert duplicate key in object 'dbo.sometable'. The duplicate key value is (8, 8).
ã芧ã®ãšããããšã©ãŒã¡ãã»ãŒãžã®ãã©ãŒãããã¯error_handler_spãšã¯å°ãç°ãªããŸãããåºæ¬çãªèãæ¹ã¯åãã§ããslog.sqleventlogããŒãã«ã«æžã蟌ãŸãããã®ã®ãµã³ãã«ã次ã«ç€ºããŸãã
logid | ãã°ããŒã | errno | å³ãã | logproc | ãªããã | msgtext |
1 | 2015-01-25 22ïŒ40ïŒ24.393 | 515 | 16 | insert_data | 5 | æ¿å ¥ã§ããŸãã... |
2 | 2015-01-25 22ïŒ40ïŒ24.395 | 2627 | 14 | insert_data | 6 | éå |
SqlEventLogãè©ŠããŠã¿ããå Žåã¯ãsqleventlog.zipãã¡ã€ã«ãããŠã³ããŒãã§ããŸããã€ã³ã¹ããŒã«æé ã¯ã3çªç®ã®éšåãSqlEventLogã®ã€ã³ã¹ããŒã«ã«ãããŸãã
5.æåŸã®ã³ã¡ã³ã
ã¹ãã¢ãããã·ãŒãžã£ã§ãšã©ãŒãšãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããããã®åºæ¬çãªãã¿ãŒã³ãåŠç¿ããŸãããå®å šã§ã¯ãããŸããããã³ãŒãã®90ã95ïŒ ã§æ©èœããã¯ãã§ãã泚æãã¹ãããã€ãã®å¶éããããŸãã
- , , , .
- , TRY-CATCH, RAISERROR .
- Linked Server , .
- INSERT-EXEC, , ROLLBACK TRANSACTION .
- , error_handler_sp SqlEventLog, , SQL Server . ;THROW .
ãããã®ç¶æ³ã«ã€ããŠã¯ããã®ã·ãªãŒãºã®ä»ã®èšäºã§è©³ãã説æããŸãã
çµäºããåã«ãããªã¬ãŒãšã¯ã©ã€ã¢ã³ãã³ãŒãã«ã€ããŠç°¡åã«è§ŠããããšæããŸãã
ããªã¬ãŒ
ããªã¬ãŒã§ã®ãšã©ãŒåŠçã®äŸã¯ã1ã€ã®å°ããªè©³çŽ°ãé€ããŠãã¹ãã¢ãããã·ãŒãžã£ã§äœ¿çšããããã®ãšå€§å·®ãããŸããïŒRETURNåŒã䜿çšããªãã§ãã ããïŒããªã¬ãŒã§RETURNã䜿çšã§ããªãããïŒã
ããªã¬ãŒã«ã€ããŠã¯ãããªã¬ãŒãèµ·åããããŒã ã®äžéšã§ãããBEGIN TRANSACTIONã䜿çšããŠããªãå Žåã§ããããªã¬ãŒå ã®ãã©ã³ã¶ã¯ã·ã§ã³å ã«ããããšãç解ããããšãéèŠã§ãã
æã ããã©ãŒã©ã ã§ãç«ã¡äžããããŒã ãåããå Žåã«ããŒã«ããã¯ããªãããªã¬ãŒãäœæã§ãããã©ãããå°ãã人ãããŸããçãã¯æ¬¡ã®ãšããã§ããããã確å®ã«è¡ãæ¹æ³ã¯ãªããããè©ŠããŠã¯ãããŸããããããå¿ èŠãªå Žåãå¯èœã§ããã°ãããªã¬ãŒããŸã£ãã䜿çšããã«ãå¥ã®è§£æ±ºçãèŠã€ããŠãã ããã第2éšãšç¬¬3éšã§ã¯ãããªã¬ãŒã®ãšã©ãŒåŠçã«ã€ããŠè©³ãã説æããŸãã
ã¯ã©ã€ã¢ã³ãã³ãŒã
ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ã§ããå Žåãã¯ã©ã€ã¢ã³ãã³ãŒãã«ãšã©ãŒåŠçãå¿ èŠã§ããã€ãŸããã©ã®åŒã³åºãã§ããäœããééã£ãŠããå¯èœæ§ããããšåžžã«æ³å®ããå¿ èŠããããŸãããšã©ãŒåŠçãæ£ç¢ºã«å®è£ ããæ¹æ³ã¯ãç¹å®ã®ç°å¢ã«ãã£ãŠç°ãªããŸãã
ããã§ã¯éèŠãªããšã«ã®ã¿æ³šæãæããŸããSQLServerããè¿ããããšã©ãŒãžã®å¿çã¯ãå€ç«ãããã©ã³ã¶ã¯ã·ã§ã³ãåé¿ããããã«ãã¯ãšãªã®å®äºã§ããå¿ èŠããããŸãã
IF @@trancount > 0 ROLLBACK TRANSACTION
ããã¯ãæåãªã¿ã€ã ã¢ãŠãæéåãã¡ãã»ãŒãžïŒSQL Serverããã®ã¡ãã»ãŒãžã§ã¯ãªããAPIããã®ã¡ãã»ãŒãžïŒã«ãé©çšãããŸãã
6.æåã®éšåã®çµãã
ããã§ãã·ãªãŒãºã®3ã€ã®ããŒãã®ãã¡ã®æåã®ããŒãã®çµããã§ãããšã©ãŒåŠçã®åé¡ããã°ãã調æ»ãããå Žåã¯ãããã§èªæžãçµäºã§ããŸããããã«é²ãããšã«æ±ºããå Žåã¯ãããŒã2ãèªãå¿ èŠããããŸããããã§ã¯ãSQL Serverã§ã®çŽãããããšã©ãŒãšãã©ã³ã¶ã¯ã·ã§ã³åŠçã®ãžã£ã³ã°ã«ã®æ ãå®éã«å§ãŸããŸãã
...ã¹ãã¢ãããã·ãŒãžã£ã®å é ã«æ¬¡ã®è¡ãè¿œå ããããšãå¿ããªãã§ãã ããã
SET XACT_ABORT, NOCOUNT ON