T-SQL的程式碼是依序執行的
假設,一個預存程序C 裡面需要依序執行預存程序A、B
簡單的寫法如下
CREATE PROC sp_C
AS
EXEC sp_A
EXEC sp_B
GO
這樣的寫法,SQL再處理的時候會依序執行sp_A再執行sp_B
不過會遇到一個問題就是,當預存程序 sp_A 執行失敗,預存程序 sp_B 會接著執行
如果sp_B 需要執行非長久,且sp_B需要參照sp_A所執行後的結果
這樣會耗費執行時間,且sp_B執行後的結果也不正確。
若要解決上述問題,需要修改一下預存程序 sp_C 的語法,加上檢核錯誤的程式碼
可以讓sp_A執行失敗後,就直接跳至錯誤處理
完整的測試SampleCode如下
IF OBJECT_ID('LogTB') IS NOT NULL DROP TABLE LogTB CREATE TABLE LogTB (ID INT IDENTITY (1,1),PGName NVARCHAR(10) ,BeginDate DATETIME ,EndDate DATETIME,ErrorMsg nvarchar(max)) --===================================== IF OBJECT_ID('sp_A') IS NOT NULL DROP PROC sp_A GO CREATE PROC sp_A AS INSERT INTO LogTB(PGName,BeginDate)values('A',GETDATE()) SELECT * FROM Tbl WAITFOR DELAY '00:00:03'; PRINT 'A IS OK ' UPDATE LogTB SET EndDate=GETDATE()WHERE PGName='A' GO --===================================== IF OBJECT_ID('sp_B') IS NOT NULL DROP PROC sp_B GO CREATE PROC sp_B AS INSERT INTO LogTB(PGName,BeginDate)values('B',GETDATE()) WAITFOR DELAY '00:00:01'; PRINT 'B IS OK ' UPDATE LogTB SET EndDate=GETDATE()WHERE PGName='B' --===================================== IF OBJECT_ID('sp_C') IS NOT NULL DROP PROC sp_C GO CREATE PROC sp_C AS DECLARE @nError SMALLINT EXEC sp_A -- 檢核Error SET @nError = @@ERROR IF @nError <> 0 GOTO logStatus EXEC sp_B -- 檢核Error SET @nError = @@ERROR IF @nError <> 0 GOTO logStatus logStatus: PRINT 'NOT OK' --UPDATE LogTB SET ErrorMsg =ERROR_MESSAGE() WHERE PGName =@PGName EXEC sp_C SELECT * FROM LogTB
全站熱搜