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
文章標籤
全站熱搜
