RaiseError i SQL Server (Norsk)

RaiseError i SQL Server (Norsk)

Tilbake til: SQL Server-Veiledning For Nybegynnere og Profesjonelle

RaiseError i SQL Server med Eksempel på

I denne artikkel, Jeg kommer til å diskutere RaiseError i SQL Server og sammen med @@FEIL ved hjelp av en real-time eksempel. Vennligst les vår tidligere artikkel før du går videre til denne artikkelen, der vi diskuterte det Grunnleggende om Unntak Håndtering i SQL Server med noen eksempler.,

Vennligst bruk under SQL-Skript for å lage og fylle Produktet og ProductSales bord med noen test data.

SELECT * FROM Produkt som vil gi oss under utgang

Opprett følgende lagret prosedyre 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

De ovenfor lagret prosedyre aksepterer 2 parametere – ProductID og QuantityToSell., Den ProductID parameteren angir produkt som vi ønsker å selge og QuantityToSell parameteren angir den mengde som vi ønsker å selge.

problemet med de ovenfor lagret prosedyre er at transaksjonen er alltid kommer til å være forpliktet, selv om det er en feil et sted mellom oppdatere Produktet bordet og setter det inn i ProductSales bordet.,

Den viktigste hensikten med å pakke disse 2-setninger (Oppdatering Produktet Uttalelse & Sett inn ProductSales statement) i en transaksjon, som er å sikre at begge disse påstandene er behandlet som en enkelt enhet.

For eksempel, hvis vi har en feil ved kjøring av den andre erklæringen, den første erklæringen bør bli rullet tilbake.,

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 fremgangsmåten ovenfor, hvis du kommentere linjen (Sett @MaxProductSalesId = @MaxProductSalesId + 1), og deretter kjøre den lagrede prosedyren vil det være en primærnøkkel brudd feilmeldingen når du prøver å sette inn i ProductSales tabell som et resultat av hvor hele transaksjonen vil bli rullet tilbake.

Merk:

Den @@FEILEN er fjernet og reset på hvert utsagn gjennomføring. Sjekk det ut umiddelbart etter uttalelse blir verifisert, eller lagre den til en lokal variabel som kan kontrolleres senere.,

I Produktet bordet, vi allerede har en oppføring med ProductID = 4. Så sett uttalelse fører til en primærnøkkel brudd feil. Den @@FEIL beholder feil nummer, som vi er for å sjekke den umiddelbart etter uttalelse som forårsaker feilen.

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

På den annen side, når du utfører den koden under, vil du få meldingen «Ingen Feil’. Dette er fordi @@FEILEN er fjernet og reset på hvert utsagn gjennomføring.,

I eksempelet nedenfor, er vi lagrer verdien av @@ – Feil funksjon til en lokal variabel, som deretter brukes senere.

I den neste artikkelen, jeg kommer til å diskutere hvordan å øke feil eksplisitt i SQL Server og også vi vil diskutere ulike alternativer som vi kan bruke med Raiserror funksjon. Her, i denne artikkelen, jeg prøver å forklare RaiseError i SQL Server sammen med @@FEIL, trinn for trinn med noen eksempler.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *