0

次のような非常に単純な SP があります。

BEGIN

SET @CUR_IO_GB = @IO_GB
SET @CUR_TOTDATE = @TOTDATE
SET @CUR_TOT_NO = @TOT_NO
SET @CUR_TOT_NO_SEQ = @TOT_NO_SEQ
SET @CUR_CUS_CD = @CUS_CD
SET @CUR_MAT_CD = @MAT_CD
SET @CUR_JCOLOR = @JCOLOR
SET @CUR_CANCEL_YN = @CANCEL_YN
SET @CUR_CREQTY = @CREQTY

SELECT  @ERR_MSG    = 2
PRINT 'INSERTING'
INSERT  INTO    LC_OUT_REQUEST_DETAIL(IO_GB, TOTDATE, TOT_NO, TOT_NO_SEQ, 
                LOCCD, ALLOC_QTY, OUT_QTY, IN_EMP, IN_DATE, UP_EMP, UP_DATE,
                CUS_CD, MAT_CD, JCOLOR, CANCEL_YN, DELIVERY_YN, OUT_YN, JDANGA)
VALUES('021', '20130817',  '000001', '000001', 
    'A0021', 2, 2, 'BATCH4', GETDATE(), 'BATCH4', GETDATE(),
    '0001031080', '41183', '1090', '1','1', 'N', 15 )

PRINT @ERR_MSG
SELECT  @ERR_MSG    = 2
RETURN @ERR_MSG

END

テスト目的で、重複キーを挿入して主キー違反を引き起こすことで、上記のストアド プロシージャを意図的に壊そうとしました。

私の質問は、エラーが発生した場合でも、ERR_MSG で 2 の結果が期待されることです (たとえば、@ERR_MSG を印刷すると 2 が得られますが、@ERR_MSG = 2 を選択してから返すと常に null になります)。

この動作の原因は何ですか? エラー時に必要な値を選択して返す方法はありますか?

4

2 に答える 2

2

Error_Message() 変数を Try-Catch と共に使用して、エラーの内容を知ることができます http://technet.microsoft.com/en-us/library/ms190358.aspx

SELECT @ERR_MSG = "NoError"  -- Indicating no error

BEGIN TRY
    INSERT  INTO    LC_OUT_REQUEST_DETAIL(IO_GB, TOTDATE, TOT_NO, TOT_NO_SEQ, 
            LOCCD, ALLOC_QTY, OUT_QTY, IN_EMP, IN_DATE, UP_EMP, UP_DATE,
            CUS_CD, MAT_CD, JCOLOR, CANCEL_YN, DELIVERY_YN, OUT_YN, JDANGA)
     VALUES('021', '20130817',  '000001', '000001', 
    'A0021', 2, 2, 'BATCH4', GETDATE(), 'BATCH4', GETDATE(),
    '0001031080', '41183', '1090', '1','1', 'N', 15 )
END TRY
BEGIN CATCH
    SELECT  @ERR_MSG = ERROR_MESSAGE()
END CATCH

SELECT @ERR_MSG
于 2013-08-16T14:07:33.387 に答える
1

エラーが発生すると、ステートメントの実行が停止され、エラーのみが返されます。そこに try/catch ブロックを追加してから、返したいエラーをハードコードします ("2" にしたいため)。

于 2013-08-16T13:42:00.233 に答える