Проблема в хранимой процедуре, получающей ошибку несоответствия - PullRequest
0 голосов
/ 28 апреля 2019

Кто-нибудь может сказать, пожалуйста, в чем проблема с моим кодом?Я пытался в течение длительного времени, но код просто не работает.

Оператор Select не выполняется и выдает ошибку:

Сообщение 266, Уровень 16,Состояние 2, процедура HW5INS2, строка 14
Количество транзакций после EXECUTE указывает на несовпадающее количество операторов BEGIN и COMMIT.Предыдущий счет = 0, текущий счет = 1.

Что делать?

ALTER PROCEDURE HW5INS2
    -----LEVEL-2:ShipmentBoxes
    @boxID VARCHAR(16),
    @boxWeight NUMERIC(6,2),
    @boxHeight NUMERIC(5,2),
    @boxWidth NUMERIC(5,2),
    @boxLength NUMERIC(5,2),
    @packager SMALLINT,
    @shipDate SMALLDATETIME ='2018-03-02'  ----NOT REQUIRED
AS
BEGIN TRANSACTION
    ---------Test For Existence Of Parent Row: LOOK INTO Employees TABLE
    IF EXISTS (SELECT employeeID FROM Employees WHERE employeeID = @packager)
    BEGIN
        BEGIN TRANSACTION
        BEGIN TRY
            INSERT INTO ShipmentBoxes (boxID, boxWeight, boxHeight, boxWidth, boxLength, packager, shipDate)
            VALUES (@boxID, @boxWeight, @boxHeight, @boxWidth, @boxLength, @packager, @shipDate)

            SELECT * FROM ShipmentBoxes

            COMMIT
        END TRY
        BEGIN CATCH
            ROLLBACK TRANSACTION

            PRINT 'Error occurred while trying to insert the ShipmentBoxes table'
            SELECT
                ERROR_NUMBER() as errornumber,
                XACT_state() as xstate
        END CATCH
    END
    ELSE
    BEGIN
        -----PARENT DOESNOT EXIST, RETURN ERROR
        ROLLBACK TRANSACTION
        PRINT 'Error: PARENT does not exist'
    END

    RETURN

1 Ответ

0 голосов
/ 28 апреля 2019

Сообщение ясно, один или несколько ваших BEGIN/END блоков не имеют оператора закрытия END. Кроме того, было бы лучше оставить все внутри блока TRY/CATCH, чтобы убедиться, что вы перехватите все ошибки и будете использовать только один оператор COMMIT/ROLLBACK (без избыточности). в приведенной ниже ревизии вы можете использовать RAISERROR для отката транзакции и отображения ошибки.

ALTER PROCEDURE HW5INS2
    @boxID varchar(16),
    @boxWeight numeric(6,2),
    @boxHeight numeric(5,2),
    @boxWidth numeric(5,2),
    @boxLength numeric(5,2),
    @packager smallint,
    @shipDate smalldatetime ='2018-03-02'  ----NOT REQUIRED
AS
BEGIN

    BEGIN TRY

        BEGIN TRANSACTION

            IF EXISTS(SELECT employeeID FROM Employees WHERE employeeID = @packager)
            BEGIN

                INSERT INTO ShipmentBoxes (boxID, boxWeight, boxHeight, boxWidth, boxLength, packager, shipDate)
                VALUES (@boxID, @boxWeight, @boxHeight, @boxWidth, @boxLength, @packager, @shipDate)

                SELECT * FROM ShipmentBoxes

                COMMIT  

            END
            ELSE
            BEGIN
              -- USE RAISERROR() TO CATCH THE ERROR AND ROLLBACK TRANSACTION. 
              RAISERROR('Error: PARENT DOESNOT EXIST',16,1)           

            END

    END TRY
    BEGIN CATCH

        ROLLBACK TRANSACTION

        PRINT 'Error Occured While Trying To Insert The ShipmentBoxes Table'
        SELECT
            ERROR_MESSAGE() as ErrorMessage, -- To Display the RAISERROR Message
            ERROR_NUMBER() as errornumber,
            XACT_state() as xstate

    END CATCH

END  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...