Хранимая процедура упражнения AP базы данных SQL

Я создал эту хранимую процедуру, но получаю так много ошибок, что не могу понять, что не так с моим кодом. Если бы кто-то мог помочь, это было бы здорово.

Направления

Напишите хранимую процедуру, используя транзакционную обработку, которая вставляет новую строку в Vendor таблица, а затем добавляет по крайней мере один новый Invoice а также InvoiceLineItems для этого нового Vendor, Эта программа должна включать в себя возможность обрабатывать неудачные транзакции, и в этом случае она должна выдавать сообщение об ошибке и откат.

Мой код:

USE AP

CREATE PROCEDURE Test02_sp 
AS
    @VendorName VARCHAR(50),
    @VendorCity VARCHAR(50),
    @VendorState CHAR(2),
    @VendorZipCode VARCHAR(20),
    @ShipName VARCHAR(MAX),
    @ShipRegion VARCHAR(MAX),
    @ShipPostalCode VARCHAR(MAX),
    @ShipCountry VARCHAR(MAX),
    @CustomerID INT,
    @CompanyName VARCHAR(MAX),
    @Address VARCHAR(MAX),
    @City VARCHAR(MAX),
    @Region VARCHAR(MAX),
    @PostalCode VARCHAR(MAX),
    @Country VARCHAR(MAX),
    @DefaultTermsID INT = NULL,
    @DefaultAccountNo INT = NULL,
BEGIN
    ALTER TABLE Vendor
        ADD DefaultTermsID INT NULL 
            CONSTRAINT Vendor_DefaultTermsID DEFAULT 3

    ALTER TABLE Vendor 
        ADD COLUMN VendorID INT PRIMARY KEY IDENTITY(1,1) NOT NULL
    GO

    ALTER TABLE Vendor 
        ADD DF_Vendors_AccountNo INT NULL 
            CONSTRAINT Vendor_DF_Vendors_AccountNo DEFAULT 570
    GO

    ALTER TABLE Vendor 
        ADD DefaultTermsID INT NULL 
            CONSTRAINT Vendor_DefaultTermsID DEFAULT 3
    GO

    INSERT INTO Vendor
    VALUES (@VendorName, @VendorCity, @VendorState, @VendorZipCode, @DefaultTermsID, @DefaultAccountNo)
    GO

    INSERT INTO Invoices 
    VALUES (@ShipName, @ShipAddress, @ShipCity, @ShipRegion, @ShipPostalCode, @ShipCountry, 
            @CustomerID, @CompanyName, @Address, @City, @Region, @PostalCode, @Country)
    GO
END

1 ответ

Решение

Вы должны применить транзакцию к вашему запросу.

BEGIN TRANSACTION [Tran1]

SET XACT_ABORT OFF
BEGIN TRY

    ALTER TABLE Vendor
    ADD DefaultTermsID int NULL CONSTRAINT Vendor_DefaultTermsID DEFAULT 3

    ALTER TABLE Vendor ADD COLUMN VendorID int PRIMARY KEY IDENTITY(1,1) NOT NULL

    ALTER TABLE Vendor ADD DF_Vendors_AccountNo int NULL CONSTRAINT
    Vendor_DF_Vendors_AccountNo DEFAULT 570

    ALTER TABLE Vendor ADD DefaultTermsID int NULL CONSTRAINT Vendor_DefaultTermsID DEFAULT 3

    INSERT INTO Vendor
    VALUES (@VendorName,@VendorCity,@VendorState,@VendorZipCode,@DefaultTermsID,@DefaultAccountNo)

    INSERT INTO Invoices 
    VALUES (@ShipName,@ShipAddress,@ShipCity,@ShipRegion,@ShipPostalCode,@ShipCountry,@CustomerID,@CompanyName,@Address,@City,@Region,@PostalCode,@Country)


    COMMIT TRANSACTION [Tran1]

END TRY

BEGIN CATCH
    SELECT 'In Catch. Error occured', 4,  @@TRANCOUNT

     IF (XACT_STATE()) = 0
    BEGIN
        SELECT
            N'There is no transaction'

    END;


     IF (XACT_STATE()) = -1
    BEGIN
        SELECT
            N'The transaction is in an uncommittable state.' +
            'Rolling back transaction.'
        ROLLBACK TRANSACTION;
    END;

    -- Test whether the transaction is committable.
    IF (XACT_STATE()) = 1
    BEGIN
        SELECT
            N'The transaction is committable.' +
            'Committing transaction.'
        COMMIT TRANSACTION;   
    END;


END CATCH
Другие вопросы по тегам