Хранимая процедура упражнения 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