RaiseError v SQL Server

RaiseError v SQL Server

Zpět na: SQL Server Výukový program Pro Začátečníky a Profesionály,

RaiseError v SQL Server s Příkladem

V tomto článku Budu diskutovat o RaiseError v SQL Server a spolu s @@CHYBA používat jeden skutečný příklad. Přečtěte si náš předchozí článek, než přistoupíte k tomuto článku, kde jsme diskutovali o základech zpracování výjimek v SQL Serveru s některými příklady.,

použijte níže SQL skript k vytvoření a naplnění tabulky produktů a produktů s některými testovacími daty.

VYBERTE * Z Produktu se nám pod výstup

Vytvořit následující uložené procedury pro prodej produktů.

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

výše uložený postup akceptuje 2 parametry-ProductID a Quantititytosell., Parametr ProductID určuje produkt, který chceme prodat, a parametr QuantityToSell určuje množství, které chceme prodat.

problém s výše uložené procedury je, že transakce bude vždy být spáchány i když tam je chyba někde mezi aktualizace Produktu stolu a vložením do ProductSales stolu.,

hlavním účelem balení tyto 2 příkazy (Aktualizace Produktu, Prohlášení & Vložit do ProductSales prohlášení) v transakci je zajistit, že obě tato prohlášení se považují za jeden celek.

pokud například při provádění druhého příkazu dojde k chybě, měl by být první příkaz vrácen zpět.,

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

Ve výše uvedeném postupu, pokud se vám komentář řádku (Set @MaxProductSalesId = @MaxProductSalesId + 1), a pak spustit uložené procedury bude narušení primárního klíče chyba, když se snažím chcete-li vložit do ProductSales tabulky jako výsledek, který celá transakce bude vrácena zpět.

Poznámka:

@@chyba je vymazána a resetována při každém provedení příkazu. Zkontrolujte jej ihned po ověření příkazu nebo jej uložte do místní proměnné, kterou lze později zkontrolovat.,

v tabulce produktů již máme záznam s ProductID = 4. Příkaz insert tedy způsobuje chybu porušení primárního klíče. Chyba @@zachovává číslo chyby, protože ji kontrolujeme ihned po prohlášení, které způsobuje chybu.

INSERT INTO Product values(4, 'Mobile Phone', 1500, 100)IF(@@ERROR <> 0) PRINT 'Error Occurred'ELSE PRINT 'No Errors'

Na druhou stranu, když si spustit kód níže, dostanete zprávu ‚Bez Chyb‘. Je to proto, že chyba @@ @ je vymazána a resetována při každém provedení příkazu.,

V příkladu níže, jsme skladování hodnota @@Chybové funkce pro lokální proměnné, které je pak použít později.

V příštím článku se budu diskutovat o tom, jak zvýšit chyby výslovně v SQL Server a také budeme diskutovat o různé možnosti, které můžeme použít s Raiserror funkce. Zde se v tomto článku snažím vysvětlit RaiseError v SQL Serveru spolu s @@ERROR krok za krokem s některými příklady.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *