RaiseError în SQL Server (Română)

RaiseError în SQL Server (Română)

Înapoi la: SQL Server Tutorial Pentru Începători și Profesioniști

RaiseError în SQL Server cu Exemplu

În acest articol, Am de gând pentru a discuta despre RaiseError în SQL Server și, împreună cu @@de EROARE folosind una în timp real de exemplu. Vă rugăm să citiți articolul nostru anterior înainte de a trece la acest articol în care am discutat elementele de bază ale manipulării excepțiilor în SQL Server cu câteva exemple.,

utilizați scriptul SQL de mai jos pentru a crea și popula tabelul de produse și produse cu unele date de testare.

SELECT * FROM Produse ne va da mai jos de ieșire

Creați următoarea procedură stocată pentru vânzări de produse.

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

Cele de mai sus-procedură stocată acceptă 2 parametri – ProductID și QuantityToSell., Parametrul ProductID specifică produsul pe care dorim să-l vindem, iar parametrul QuantityToSell specifică cantitatea pe care dorim să o vindem.

problema cu cele de mai sus-procedură stocată este că tranzacția este întotdeauna o să fie comise chiar dacă există o eroare undeva între actualizarea de Produs de masă și introducându-l în ProductSales masă.,

scopul principal de a încheia aceste 2 declarații (Update Produsului Declarație & Introduce în ProductSales declarație) într-o tranzacție este de a se asigura că ambele afirmații sunt tratate ca o singură unitate.

de exemplu, dacă avem o eroare la executarea celei de-a doua instrucțiuni, atunci prima instrucțiune ar trebui să fie derulată înapoi.,

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

În procedura de mai sus, dacă ai comenta linia (Set @MaxProductSalesId = @MaxProductSalesId + 1), și apoi executa proceduri stocate acolo va fi o cheie primară încălcare eroare atunci când încercați să introduceți în ProductSales masa ca un rezultat de care intreaga tranzactie va fi derulată înapoi.

notă:

eroarea @@este șters și resetat pe fiecare execuție declarație. Verificați-l imediat după instrucțiunea verificată sau salvați-o într-o variabilă locală care poate fi verificată ulterior.,

în tabelul de produse, avem deja o înregistrare cu ProductID = 4. Deci, instrucțiunea insert provoacă o eroare de încălcare a cheii primare. Eroarea @@păstrează numărul de eroare, deoarece îl verificăm imediat după declarația care provoacă eroarea.

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

Pe de altă parte, atunci când executați codul de mai jos, veți primi mesajul ‘Fără Erori. Acest lucru se datorează faptului că eroarea @@este șters și resetat pe fiecare execuție declarație.,

În exemplul de mai jos, suntem stocarea valoarea de @@funcția de Eroare la o variabilă locală, care este apoi utilizat mai târziu.

În următorul articol, voi discuta despre cum să ridice erori în mod explicit în SQL Server și, de asemenea, vom discuta despre diferitele opțiuni pe care le puteți utiliza cu Raiserror funcție. Aici, în acest articol, încerc să explic RaiseError în SQL Server împreună cu @ @ ERROR pas cu pas cu câteva exemple.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *