RaiseError in SQL Server (Italiano)

RaiseError in SQL Server (Italiano)

Torna a: SQL Server Tutorial Per Principianti e Professionisti

RaiseError in SQL Server con Esempio

In questo articolo, Sto a discutere il RaiseError in SQL Server e lungo con le @@di ERRORE utilizzando un real-time esempio. Si prega di leggere il nostro articolo precedente prima di procedere a questo articolo in cui abbiamo discusso le basi della gestione delle eccezioni in SQL Server con alcuni esempi.,

Si prega di utilizzare sotto script SQL per creare e popolare il prodotto e ProductSales tabella con alcuni dati di test.

SELECT * FROM Product ci darà l’output sottostante

Crea la seguente stored procedure per le vendite dei prodotti.

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

La procedura sopra memorizzata accetta 2 parametri: ProductID e QuantityToSell., Il parametro ProductID specifica il prodotto che vogliamo vendere e il parametro QuantityToSell specifica la quantità che vogliamo vendere.

Il problema sopra stored procedure è che la transazione è sempre sta per essere commesso anche se c’è un errore da qualche parte tra di aggiornare il Prodotto tavolo e di inserirlo nel Venditeprodotto tabella.,

Lo scopo principale del wrapping di queste 2 istruzioni (Update Product Statement& Insert into ProductSales statement) in una transazione è garantire che entrambe queste istruzioni siano trattate come una singola unità.

Ad esempio, se si verifica un errore durante l’esecuzione della seconda istruzione, la prima istruzione deve essere ripristinata.,

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

Nella procedura di cui sopra, se commento la riga (Set @MaxProductSalesId = @MaxProductSalesId + 1), e quindi eseguire la stored procedure non ci sarà una violazione di chiave primaria di errore quando si tenta di inserire nel Venditeprodotto tabella come risultato di cui la transazione verrà eseguito il rollback.

Nota:

L’ERRORE @@viene cancellato e ripristinato su ogni esecuzione dell’istruzione. Controllalo immediatamente dopo la verifica dell’istruzione o salvalo in una variabile locale che può essere controllata in seguito.,

Nella tabella dei prodotti, abbiamo già un record con ProductID = 4. Quindi l’istruzione insert causa un errore di violazione della chiave primaria. L’ERRORE @@mantiene il numero di errore, poiché lo stiamo controllando immediatamente dopo l’istruzione che causa l’errore.

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

D’altra parte, quando si esegue il codice qui sotto, si otterrà il messaggio ‘Nessun errore’. Questo perché l’ERRORE @@viene cancellato e ripristinato su ogni esecuzione dell’istruzione.,

Nell’esempio seguente, stiamo memorizzando il valore della funzione @@Error in una variabile locale, che viene quindi utilizzata in seguito.

Nel prossimo articolo, ho intenzione di discutere come generare errori in modo esplicito in SQL Server e anche discuteremo le diverse opzioni che possiamo usare con la funzione Raiserror. Qui, in questo articolo, cerco di spiegare RaiseError in SQL Server insieme a @@ERROR passo dopo passo con alcuni esempi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *