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