RaiseError az SQL Server

RaiseError az SQL Server

Vissza: Az SQL Server Tutorial Kezdőknek, illetve Szakemberek

RaiseError az SQL Server Példa

ez A cikk, Én megyek, hogy megvitassák a RaiseError az SQL Szerver együtt @@HIBA segítségével egy valós példa. Kérjük, olvassa el korábbi cikkünket, mielőtt folytatnánk ezt a cikket, ahol néhány példával megtárgyaltuk az SQL Server Kivételkezelésének alapjait.,

kérjük, használja az alábbi SQL szkriptet a termék és a ProductSales táblázat létrehozásához és feltöltéséhez néhány tesztadattal.

SELECT * from Product will give us the low output

hozza létre a termékértékesítéshez a következő tárolt eljárást.

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

a fent tárolt eljárás 2 paramétert fogad el-ProductID és QuantityToSell., A ProductID paraméter meghatározza az eladni kívánt terméket, a QuantityToSell paraméter pedig meghatározza az eladni kívánt mennyiséget.

a probléma A fenti-tárolt eljárás az, hogy az ügylet mindig lesz követett el, annak ellenére, hogy van egy kis hiba, valahol között frissítése a Termék asztal, helyezze be a ProductSales táblázat.,

ezeknek a 2 állításnak a csomagolásának fő célja (Update Product Statement & Insert into ProductSales statement) egy tranzakcióban annak biztosítása, hogy mindkét állítást egyetlen egységként kezeljék.

például, ha hiba van a második utasítás végrehajtásakor, akkor az első nyilatkozatot vissza kell húzni.,

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

a fenti eljárásban, ha kommentálja a sort (Set @MaxProductSalesId = @MaxProductSalesId + 1), majd végrehajtja a tárolt eljárást lesz egy elsődleges kulcs megsértése hiba, amikor megpróbál beszúrni a ProductSales táblázat, amelynek eredményeként a teljes tranzakció kerül hengerelt vissza.

Megjegyzés:

a @@hiba törlődik, majd minden utasítás végrehajtásakor visszaáll. Ellenőrizze azonnal az ellenőrzött nyilatkozatot követően, vagy mentse el egy később ellenőrizhető helyi változóba.,

A Terméktáblázatban már van egy rekord a ProductID = 4. Tehát a Beszúrás utasítás elsődleges kulcs megsértési hibát okoz. A @@hiba megtartja a hibaszámot,mivel a hibát okozó kijelentés után azonnal ellenőrizzük.

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

az alábbi kód végrehajtásakor a “Nincs hiba” üzenet jelenik meg. Ez azért van, mert a @@hiba törlődik, majd visszaállítja az egyes utasítások végrehajtását.,

az alábbi példában a @@ @ Hibafunkció értékét egy helyi változóra tároljuk, amelyet később használunk.

a következő cikkben megvitatom, hogyan lehet kifejezetten hibákat emelni az SQL Serverben, valamint megvitatjuk a különböző lehetőségeket, amelyeket a Raiserror funkcióval használhatunk. Itt, ebben a cikkben, megpróbálom elmagyarázni a RaiseError SQL Server együtt @@hiba lépésről lépésre néhány példát.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük