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 回答