Сообщение ясно, один или несколько ваших 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