powrót do: SQL Server Tutorial For Beginners and Professionals
RaiseError in SQL Server with Example
w tym artykule omówię Raiseerror w SQL Server i wraz z @@Error za pomocą jednego przykładu w czasie rzeczywistym. Przeczytaj nasz poprzedni artykuł, zanim przejdziemy do tego artykułu, w którym omówiliśmy Podstawy obsługi wyjątków w SQL Server z kilkoma przykładami.,
użyj poniższego skryptu SQL, aby utworzyć i wypełnić tabelę produktów i ProductSales niektórymi danymi testowymi.
SELECT * FROM Product will give us the below output
Utwórz następującą procedurę składowaną dla sprzedaży produktów.
CREATE PROCEDURE spSellProduct@ProductID INT,@QuantityToSell INTASBEGIN -- First we need to Check the stock available for the product we want to sell DECLARE @StockAvailable INT SELECT @StockAvailable = QuantityAvailable FROM Product WHERE ProductId = @ProductId -- We need to throw an error to the calling application -- if the stock is less than the quantity we want to sell IF(@StockAvailable< @QuantityToSell) BEGIN Raiserror('Enough Stock is not available',16,1) END -- If enough stock is available ELSE BEGIN -- We need to start the transaction BEGIN TRANSACTION -- First we need to reduce the quantity available UPDATEProduct SET QuantityAvailable = (QuantityAvailable - @QuantityToSell) WHEREProductID = @ProductID -- Calculate MAX ProductSalesId DECLARE @MaxProductSalesId INT SELECT@MaxProductSalesId = CASE WHEN MAX(ProductSalesId) IS NULL THEN 0 ELSE MAX(ProductSalesId) END FROM ProductSales-- Increment @MaxProductSalesId by 1, so we don't get a primary key violationSet @MaxProductSalesId = @MaxProductSalesId + 1 -- We need to insert the quantity sold into the ProductSales table INSERT INTO ProductSales(ProductSalesId, ProductId, QuantitySold) VALUES(@MaxProductSalesId, @ProductId, @QuantityToSell) COMMIT TRANSACTION EndEND
powyższa procedura składowana akceptuje 2 parametry-ProductID i QuantityToSell., Parametr ProductID określa produkt, który chcemy sprzedać, a parametr QuantityToSell określa ilość, którą chcemy sprzedać.
problem z powyższą procedurą składowaną polega na tym, że transakcja zawsze zostanie popełniona, nawet jeśli gdzieś pomiędzy aktualizacją tabeli produktów a wstawieniem jej do tabela produktów.,
głównym celem zawijania tych 2 oświadczeń (zaktualizuj oświadczenie produktu & wstaw do oświadczenia ProductSales) w transakcji jest zapewnienie, że oba te oświadczenia są traktowane jako jedna jednostka.
na przykład, jeśli wystąpi błąd podczas wykonywania drugiej instrukcji, to pierwsza instrukcja powinna zostać wycofana.,
ALTER PROCEDURE spSellProduct@ProductID INT,@QuantityToSell INTASBEGIN -- First we need to Check the stock available for the product we want to sell DECLARE @StockAvailable INT SELECT @StockAvailable = QuantityAvailable FROM Product WHERE ProductId = @ProductId -- We need to throw an error to the calling application -- if the stock is less than the quantity we want to sell IF(@StockAvailable< @QuantityToSell) BEGIN Raiserror('Enough Stock is not available',16,1) END -- If enough stock is available ELSE BEGIN -- We need to start the transaction BEGIN TRANSACTION -- First we need to reduce the quantity available UPDATEProduct SET QuantityAvailable = (QuantityAvailable - @QuantityToSell) WHEREProductID = @ProductID -- Calculate MAX ProductSalesId DECLARE @MaxProductSalesId INT SELECT@MaxProductSalesId = CASE WHEN MAX(ProductSalesId) IS NULL THEN 0 ELSE MAX(ProductSalesId) END FROM ProductSales-- Increment @MaxProductSalesId by 1, so we don't get a primary key violationSet @MaxProductSalesId = @MaxProductSalesId + 1 -- We need to insert the quantity sold into the ProductSales table INSERT INTO ProductSales(ProductSalesId, ProductId, QuantitySold) VALUES(@MaxProductSalesId, @ProductId, @QuantityToSell) -- The @@Error returns a NON-ZERO value if there is an error, otherwise it will return ZERO, -- indicating that the previous SQL statement encountered no errors IF(@@ERROR <> 0) BEGIN ROLLBACK TRANSACTION PRINT 'Rolled Back the Transaction' END ELSE BEGIN COMMIT TRANSACTION PRINT 'Committed the Transaction' END EndEND
w powyższej procedurze, jeśli skomentujesz linię (Set @MaxProductSalesId = @MaxProductSalesId + 1), a następnie wykonasz procedurę składowaną, podczas próby wstawienia do tabeli ProductSales wystąpi błąd naruszenia klucza głównego, w wyniku którego cała transakcja zostanie wycofana.
Uwaga:
błąd @@jest usuwany i resetowany przy każdym wykonaniu instrukcji. Sprawdź ją natychmiast po zweryfikowaniu instrukcji lub zapisz ją do zmiennej lokalnej, którą można później sprawdzić.,
w tabeli produktów mamy już zapis z ProductID = 4. Tak więc instrukcja insert powoduje błąd primary key violation. Błąd @ @ zachowuje numer błędu, ponieważ sprawdzamy go natychmiast po instrukcji, która powoduje błąd.
INSERT INTO Product values(4, 'Mobile Phone', 1500, 100)IF(@@ERROR <> 0) PRINT 'Error Occurred'ELSE PRINT 'No Errors'
z drugiej strony, gdy wykonasz poniższy kod, otrzymasz komunikat „Brak błędów”. Dzieje się tak dlatego, że błąd @@jest usuwany i resetowany przy każdym wykonaniu instrukcji.,
w poniższym przykładzie zapisujemy wartość funkcji @@Error do zmiennej lokalnej, która jest następnie używana później.
w następnym artykule omówię sposób jawnego podnoszenia błędów w SQL Server, a także omówimy różne opcje, które możemy użyć z funkcją Raiserror. Tutaj, w tym artykule, staram się wyjaśnić RaiseError w SQL Server wraz z @ @ błąd krok po kroku z kilkoma przykładami.