Получение несоответствия BEGIN и END error. но у каждого НАЧАЛО есть КОНЕЦ и наоборот - PullRequest
0 голосов
/ 20 июня 2019

Я проверил и, похоже, не могу найти несоответствие ни в НАЧАЛЕ, ни в КОНЦЕ, а также НАЧАТЬ СДЕЛКИ и ПРИНЯТЬ.Есть ли что-то, чего я не понимаю в отношении ВОЗВРАТОВ или Поскольку я вызываю несколько хранимых процедур в рамках хранимой процедуры, это вызывает вложенную транзакцию и является причиной ошибки?

Я проектирую серверную часть, котораяпозволяет хранилищу приложений и отслеживать перемещения слотов, например, черновики между отделами внутри организации.У меня есть хранимая процедура, когда вы создаете новый отдел, вы указываете, сколько слотов вы хотите, чтобы этот новый отдел имел, и он генерирует слоты в таблице слотов, а затем добавляет их в таблицу DepartmentSlots, связывая их с отделом, который был простосоздано.

-- ================================================================================
-- Add Department
-- ================================================================================
GO
    CREATE PROCEDURE uspAddDepartment       
        @DepartmentName                 VARCHAR(50),
        @AllocatedSlots                 DECIMAL(18, 2) 

    AS
        SET NOCOUNT ON;
        SET XACT_ABORT ON;

        BEGIN TRANSACTION
            -- See if the department Exists
            DECLARE @DepartmentExists       AS BIT = (SELECT CASE WHEN EXISTS (SELECT @DepartmentName FROM [HeadCount_Ver01].[dbo].Departments WHERE UPPER(DepartmentName) = UPPER(@DepartmentName)) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END)
            IF (@DepartmentExists = 0)
                BEGIN

                    INSERT INTO [HeadCount_Ver01].[dbo].Departments(DepartmentName, AllocatedSlots)
                    VALUES(@DepartmentName, @AllocatedSlots);

                    DECLARE @DepartmentID AS INTEGER = (SELECT MAX(DepartmentID) FROM Departments)

                    -- Now that we have created a department with newly allocated slots, we have to create those records in DepartmentSlots, and Slots
                    EXECUTE uspGenerateSlots @DepartmentID, @AllocatedSlots;
                END
            ELSE
                BEGIN
                    SELECT 'DEPARTMENT EXISTS'
                END
        COMMIT;
GO


-- ================================================================================
-- Add Slots
-- ================================================================================
GO
    CREATE PROCEDURE uspAddSlot

    AS
        SET NOCOUNT ON;
        SET XACT_ABORT ON;

        BEGIN TRANSACTION
            -- Incriment the Identity Column adding a new slot
            INSERT INTO [HeadCount_Ver01].[dbo].Slots DEFAULT VALUES;
            -- Return the SlotID
            RETURN(SELECT COALESCE(MAX(SlotID),1) FROM [HeadCount_Ver01].[dbo].Slots);
        COMMIT;
GO


-- ================================================================================
-- Add Department Slots
-- ================================================================================
GO
    CREATE PROCEDURE uspAddDepartmentSlots
        @departmentID       INTEGER,
        @SlotID             INTEGER
    AS
        SET NOCOUNT ON;
        SET XACT_ABORT ON;

        BEGIN TRANSACTION
            -- We are Assigning a Slot to a Department but we aren't Assigning any one to it
            INSERT INTO [HeadCount_Ver01].[dbo].DepartmentSlots
            VALUES (@departmentID, @SlotID, NULL, NULL, NULL);
        COMMIT;
GO


-- ================================================================================
-- Generate Slots
-- ================================================================================
GO
    CREATE PROCEDURE uspGenerateSlots
        @departmentID       INTEGER,
        @allocatedSlots     INTEGER
    AS
        SET NOCOUNT ON;
        SET XACT_ABORT ON;

        BEGIN TRANSACTION
            DECLARE @i      INTEGER = 0;
            DECLARE @SlotID INTEGER = 0;
            WHILE @i < @allocatedSlots
                BEGIN
                    EXECUTE @SlotID = uspAddSlot;
                    EXECUTE uspAddDepartmentSlots @departmentID, @SlotID;
                    SET @i += 1;
                END
        COMMIT;
GO

Он работает точно так, как и ожидалось, за исключением ошибки «Число транзакций после EXECUTE указывает на несовпадающее количество операторов BEGIN и COMMIT», которое, когда вызывающее приложение пытается выполнить эту хранимую процедуру, вызывает исключение.

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