RaiseError i SQL Server (Svenska)

RaiseError i SQL Server (Svenska)

tillbaka till: SQL Server Tutorial för nybörjare och proffs

RaiseError i SQL Server med exempel

I den här artikeln kommer jag att diskutera raiseerror i SQL Server och tillsammans med @@error med ett realtidsexempel. Läs vår tidigare artikel innan du fortsätter till den här artikeln där vi diskuterade grunderna i undantagshantering i SQL Server med några exempel.,

använd under SQL Script för att skapa och fylla i tabellen produkt och ProductSales med vissa testdata.

SELECT * FROM Product kommer att ge oss nedanstående utgång

skapa följande lagrade procedur för produktförsäljning.

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

den ovan lagrade proceduren accepterar 2 parametrar-ProductID och QuantityToSell., Parametern ProductID anger den produkt som vi vill sälja och parametern QuantityToSell anger den kvantitet som vi vill sälja.

problemet med det ovan lagrade förfarandet är att transaktionen alltid kommer att begås trots att det finns ett fel någonstans mellan att uppdatera produkttabellen och infoga den i ProductSales-tabellen.,

huvudsyftet med att förpacka dessa 2-uttalanden (uppdatera Produktdeklaration& infoga i ProductSales-uttalandet) i en transaktion är att säkerställa att båda dessa uttalanden behandlas som en enda enhet.

om vi till exempel har ett fel när vi utför det andra uttalandet, ska det första uttalandet rullas tillbaka.,

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 ovanstående procedur, om du kommenterar linjen (Set @MaxProductSalesId = @MaxProductSalesId + 1), och kör sedan den lagrade proceduren kommer det att finnas ett primärt nyckelfel när du försöker infoga i ProductSales-tabellen, vilket leder till att hela transaktionen kommer att rullas tillbaka.

Obs:

@@ – felet rensas och återställs vid varje statelexekvering. Kontrollera det omedelbart efter att uttalandet verifierats, eller spara det till en lokal variabel som kan kontrolleras senare.,

i produkttabellen har vi redan en post med ProductID = 4. Så insert-satsen orsakar ett primärt nyckelöverträdelsefel. @@- Felet behåller felnumret, eftersom vi kontrollerar det omedelbart efter uttalandet som orsakar felet.

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

å andra sidan, när du kör koden nedan, får du meddelandet ”Inga fel”. Detta beror på att @@ – felet rensas och återställs vid varje statelutförande.,

I exemplet nedan lagrar vi värdet på @@Error-funktionen till en lokal variabel, som sedan används senare.

I nästa artikel kommer jag att diskutera hur man lyfter upp fel explicit i SQL Server och vi kommer också att diskutera de olika alternativen som vi kan använda med Raiserror-funktionen. Här, i den här artikeln försöker jag förklara RaiseError i SQL Server tillsammans med @fel steg för steg med några exempel.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *