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 
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小草 的頭像
    小草

    學海無邊,書囊無底

    小草 發表在 痞客邦 留言(0) 人氣()