RaiseError SQL Server

RaiseError SQL Server

Takaisin: SQL-Palvelin Opetusohjelma Aloittelijoille ja Ammattilaisille.

RaiseError SQL-Palvelin Esimerkki

tässä artikkelissa, Olen menossa keskustelemaan RaiseError SQL Server ja yhdessä @@VIRHEEN jollakin reaaliaikainen esimerkki. Lue Edellinen artikkeli ennen tämän artikkelin, jossa keskustelimme perusasiat poikkeuksen käsittely SQL Server joitakin esimerkkejä.,

käytä alla SQL Script luoda ja kansoittavat Tuote-ja ProductSales taulukko, jossa on joitakin testituloksia.

SELECT * FROM Tuote, antaa meille alla tuotos

Luo seuraava tallennettu menettely, tuotteen myynti.

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

edellä tallennettu menettely hyväksyy 2 parametrit – ProductID ja QuantityToSell., ProductID-parametri määrittää tuotteen, jonka haluamme myydä, ja QuantityToSell-parametri määrittää määrän, jonka haluamme myydä.

ongelma edellä tallennettu menettely on, että tapahtuma on aina menossa olla sitoutunut, vaikka on virhe jossain välissä päivittää Tuote pöytä ja työntämällä se ProductSales taulukko.,

päätarkoitus kääre nämä 2 lausuntoja (Päivitys Tuotteen Lausunto & Työnnä ProductSales lausunto) liiketoimi on varmistaa, että molemmat lausunnot käsitellään yhtenä yksikkönä.

esimerkiksi jos meillä on virhe suoritettaessa toisen lausuman, sitten ensimmäinen lause pitäisi olla rullattu takaisin.,

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

edellä menettely, jos kommentti line (Set @MaxProductSalesId = @MaxProductSalesId + 1), ja sitten suorittaa tallennettu menettely on ensisijainen avain rikkominen virhe, kun yrität lisätä osaksi ProductSales taulukko, jonka seurauksena koko kauppa on rullattu takaisin.

Huomautus:

@@ – virhe tyhjennetään ja nollataan jokaisella lausuman suorituksella. Tarkista se välittömästi sen jälkeen, kun lausunto on tarkistettu, tai tallenna se paikalliseen muuttujaan, joka voidaan tarkistaa myöhemmin.,

tuotepöydässä on jo levy, jossa ProductID = 4. Joten insert-lausunto aiheuttaa ensisijaisen avainloukkausvirheen. @- Virhe säilyttää virhenumeron, sillä tarkistamme sen heti virheen aiheuttavan lausuman jälkeen.

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

toisaalta, kun suorittaa koodin alla, saat viestin, ’Virheitä’. Tämä johtuu siitä, että @ – virhe tyhjennetään ja nollataan jokaisella lausuman suorituksella.,

alla olevassa esimerkissä olemme tallentamiseen arvo @@Virhe funktion paikallinen muuttuja, jota käytetään sitten myöhemmin.

seuraavassa artikkelissa, aion keskustella siitä, miten nostaa virheitä nimenomaisesti SQL Server ja myös keskustelevat eri vaihtoehdoista, joita voimme käyttää Raiserror toiminto. Täällä, tässä artikkelissa yritän selittää RaiseError SQL Server yhdessä @@VIRHEEN askel askeleelta esimerkkejä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *