Zurück zu: SQL Server Tutorial Für Anfänger und Profis
RaiseError in SQL Server mit Example
In in diesem Artikel werde ich den RaiseError in SQL Server und zusammen mit @@ERROR anhand eines Echtzeitbeispiels diskutieren. Bitte lesen Sie unseren vorherigen Artikel, bevor Sie mit diesem Artikel fortfahren, in dem wir die Grundlagen der Ausnahmebehandlung in SQL Server mit einigen Beispielen erörtert haben.,
Bitte verwenden Sie das folgende SQL-Skript, um die Produkt-und ProductSales-Tabelle mit einigen Testdaten zu erstellen und zu füllen.
SELECT * FROM Product gibt uns die folgende Ausgabe
Erstellen Sie die folgende gespeicherte Prozedur für den Produktverkauf.
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
Die oben gespeicherte Prozedur akzeptiert 2 Parameter – ProductID-und QuantityToSell., Der Parameter ProductID gibt das Produkt an, das wir verkaufen möchten, und der Parameter QuantityToSell gibt die Menge an, die wir verkaufen möchten.
Das Problem mit der oben gespeicherten Prozedur besteht darin, dass die Transaktion immer festgeschrieben wird, obwohl irgendwo zwischen dem Aktualisieren der Produkttabelle und dem Einfügen in die ProductSales-Tabelle ein Fehler auftritt.,
Der Hauptzweck, diese beiden Anweisungen (Update Product Statement & Insert into ProductSales Anweisung) in eine Transaktion einzufügen, besteht darin, sicherzustellen, dass beide Anweisungen als eine Einheit behandelt werden.
Wenn beispielsweise beim Ausführen der zweiten Anweisung ein Fehler auftritt, sollte die erste Anweisung zurückgesetzt werden.,
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
Wenn Sie in der obigen Prozedur die Zeile kommentieren (Set @MaxProductSalesId = @MaxProductSalesId + 1) und dann die gespeicherte Prozedur ausführen, wird beim Versuch, sie in die ProductSales-Tabelle einzufügen, ein Primärschlüsselverstoßfehler angezeigt, wodurch die gesamte Transaktion zurückgesetzt wird.
Hinweis:
Der @@ – FEHLER wird bei jeder Anweisungsausführung gelöscht und zurückgesetzt. Überprüfen Sie es unmittelbar nach der zu überprüfenden Anweisung oder speichern Sie es in einer lokalen Variablen, die später überprüft werden kann.,
In der Produkttabelle haben wir bereits einen Datensatz mit ProductID = 4. Die insert-Anweisung verursacht also einen Fehler bei der Verletzung des Primärschlüssels. Der @@ERROR behält die Fehlernummer bei, da wir unmittelbar nach der Anweisung, die den Fehler verursacht, danach suchen.
INSERT INTO Product values(4, 'Mobile Phone', 1500, 100)IF(@@ERROR <> 0) PRINT 'Error Occurred'ELSE PRINT 'No Errors'
Andererseits erhalten Sie beim Ausführen des folgenden Codes die Meldung „Keine Fehler“. Dies liegt daran, dass der @@ERROR bei jeder Anweisungsausführung gelöscht und zurückgesetzt wird.,
Im folgenden Beispiel speichern wir den Wert der @@Error-Funktion in einer lokalen Variablen, die später verwendet wird.
Im nächsten Artikel werde ich besprechen, wie Fehler explizit in SQL Server ausgelöst werden, und wir werden auch die verschiedenen Optionen besprechen, die wir verwenden können mit Raiserror Funktion. Hier in diesem Artikel versuche ich, den RaiseError in SQL Server zusammen mit @@ERROR Schritt für Schritt mit einigen Beispielen zu erklären.