RaiseError dans SQL Server

RaiseError dans SQL Server

à: SQL Server Tutoriel Pour les Débutants et les Professionnels

RaiseError dans SQL Server avec des exemples

Dans cet article, Je vais discuter de la RaiseError dans SQL Server et avec @@ERREUR à l’aide en temps réel par exemple. Veuillez lire notre article précédent avant de passer à cet article où nous avons discuté des bases de la gestion des exceptions dans SQL Server avec quelques exemples.,

veuillez utiliser le Script SQL ci-dessous pour créer et remplir la table Product et ProductSales avec des données de test.

SELECT * from Produit qui va nous donner les dessous de sortie

Créer la procédure stockée suivante pour les ventes de produits.

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 procédure stockée ci-dessus accepte 2 paramètres – ProductID et QuantityToSell., Le paramètre ProductID spécifie le produit que nous voulons vendre et le paramètre QuantityToSell spécifie la quantité que nous voulons vendre.

le problème avec la procédure stockée ci-dessus est que la transaction sera toujours validée même s’il y a une erreur quelque part entre la mise à jour de la table de produits et son insertion table des ventes de produits.,

l’objectif principal de l’encapsulation de ces 2 instructions (Update Product Statement & Insert into ProductSales statement) dans une transaction est de s’assurer que ces deux instructions sont traitées comme une seule unité.

Par exemple, si nous avons une erreur lors de l’exécution de la deuxième déclaration, puis la première instruction devrait être annulée.,

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

dans la procédure ci-dessus, si vous commentez la ligne (Set @MaxProductSalesId = @MaxProductSalesId + 1), puis exécutez la procédure stockée, il y aura une erreur de violation de clé primaire lorsque vous essayez d’insérer dans la table ProductSales à la suite de laquelle la transaction entière sera annulée.

Remarque:

l’erreur @@est effacée et réinitialisée à chaque exécution d’instruction. Vérifiez-le immédiatement après l’instruction en cours de vérification, ou enregistrez-le dans une variable locale qui peut être vérifiée ultérieurement.,

dans la table des produits, nous avons déjà un enregistrement avec ProductID = 4. Ainsi, l’instruction insert provoque une erreur de violation de clé primaire. L’erreur @ @ conserve le numéro d’erreur, car nous le vérifions immédiatement après l’instruction qui provoque l’erreur.

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

d’autre part, lorsque vous exécutez le code ci-dessous, vous obtiendrez le message « Pas d’Erreurs ». En effet, l’erreur @@est effacée et réinitialisée à chaque exécution d’instruction.,

Dans l’exemple ci-dessous, nous sommes stockage de la valeur de @@Error fonction à une variable locale, qui est ensuite utilisé plus tard.

dans le prochain article, je vais discuter de la façon de générer des erreurs explicitement dans SQL Server et nous allons également discuter des différentes options que nous pouvons utiliser avec la fonction Raiserror. Ici, dans cet article, j’essaie d’expliquer L’erreur RaiseError dans SQL Server avec l’erreur @@étape par étape avec quelques exemples.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *