Tilbage til: SQL Server Selvstudium For Begyndere og Professionelle
RaiseError i SQL Server med Fx
I denne artikel, Jeg kommer til at diskutere RaiseError på SQL Server, og sammen med @@FEJL ved hjælp af en real-time eksempel. Læs vores tidligere artikel, før du fortsætter til denne artikel, hvor vi diskuterede det grundlæggende i undtagelseshåndtering I s .l Server med nogle eksempler.,
brug venligst nedenstående s .l Script til at oprette og udfylde produkt-og Produkttabellen med nogle testdata.
vælg * fra produktet giver os nedenstående output
Opret følgende lagrede procedure for produktsalg.
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
ovennævnte lagrede procedure accepterer 2 parametre-ProductID og Quantiuantitytosell., Parameteren ProductID angiver det produkt, vi ønsker at sælge, og parameteren Quantiuantitytosell angiver den mængde, vi ønsker at sælge.
problemet med ovenstående-lagret procedure er, at transaktionen vil altid være begået, selv om der er en fejl et eller andet sted mellem at opdatere Produktet tabel og indsætter det i ProductSales bordet.,
Det vigtigste formål for indpakning disse 2 udsagn (Opdatering Produkt Erklæring & Insert into ProductSales statement) i en transaktion er at sikre, at begge disse udtalelser er behandlet som en enkelt enhed.
for eksempel, hvis vi har en fejl, når vi udfører den anden erklæring, skal den første erklæring rulles tilbage.,
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
i ovenstående procedure, hvis du kommenterer linjen (Set @ma .productsalesid = @Ma .productsalesid + 1), og derefter udfører den lagrede procedure, vil der være en primær nøgleovertrædelsesfejl, når du prøver at indsætte i ProductSales-tabellen, som et resultat af, at hele transaktionen rulles tilbage.
Bemærk:
@@fejlen ryddes og nulstilles ved hver sætning. Kontroller det straks efter, at erklæringen er verificeret, eller gem den til en lokal variabel, der kan kontrolleres senere.,
i Produkttabellen har vi allerede en rekord med ProductID = 4. Så indsæt sætningen forårsager en primær nøgle Overtrædelse fejl. @@- Fejlen bevarer fejlnummeret, da vi kontrollerer det umiddelbart efter den erklæring, der forårsager fejlen.
INSERT INTO Product values(4, 'Mobile Phone', 1500, 100)IF(@@ERROR <> 0) PRINT 'Error Occurred'ELSE PRINT 'No Errors'
på den anden side, når du udfører koden nedenfor, får du meddelelsen ‘Ingen fejl’. Dette skyldes, at @@fejlen er ryddet og nulstillet på hver sætning udførelse.,
i nedenstående eksempel gemmer vi værdien af @@fejlfunktion til en lokal variabel, som derefter bruges senere.
i den næste artikel vil jeg diskutere, hvordan man hæver fejl eksplicit i s .l Server, og vi vil også diskutere de forskellige muligheder, som vi kan bruge med Raiserror-funktion. Her i denne artikel forsøger jeg at forklare RaiseError I S .l Server sammen med @@fejl trin for trin med nogle eksempler.