Créer une procédure stockée avec SQLServer

Les procédures stockées sont l'équivalent des fonctions en programmation classique, mais quels sont leurs avantages et leurs inconvénients ? Sont-elles plus optimisées que des requêtes classiques ?

Article publié le 21/10/2024, dernière mise à jour le 21/10/2024

Une procédure stockée est un bloc d’instructions SQL qui peut être sauvegardé et exécuté à tout moment.

Elles sont particulièrement utiles pour automatiser des tâches répétitives ou complexes, et permettent de gagner en performance (et parfois en charge réseau).

Découvrons ensemble en quelques étapes comment créer et exécuter une procédure stockée dans SQL Server.

Créer une procédure

Pour créer la procédure, vous aurez évidemment besoin d’être connecté à votre base de données SQL.

Par exemple dans un terminal, ou avec SQL Server Management Studio (SSMS)

Une fois connecté à l'instance de SQL Server sur laquelle vous souhaitez créer la procédure stockée, le script pour créer votre procédure ressemblera à ceci :

CREATE PROCEDURE <ProcedureName>
    -- Liste des paramètres
AS
BEGIN
    -- Contenu de la procédure
END;

Vous l’aurez compris, pour créer une procédure, nous utiliserons la commande CREATE PROCEDURE , puis les paramètres viendront après le nom de cette dernière, et enfin le contenu sera entre les instructions BEGIN et END.

nicolasbrondinbernard_An_invoice._100_white_background.jpg

Une procédure d’exemple

Nous allons créer une procédure d’exemple, afin de voir les possibilités que nous offre SQL Server.

Le cas d’usage est bien sûr fictif, et le schéma de base de donnée l’est aussi !

À partir d’un simple numéro de commande (sur un site e-commerce), nous allons récupérer les informations clients, les informations de la commande et insérer une nouvelle ligne dans la table des factures.

Voilà ce que ça donne :

CREATE PROCEDURE GenerateCustomerInvoice
    @OrderId INT
AS
BEGIN
    -- Déclaration de la variable intermédiaire pour stocker le ClientID
    DECLARE @CustomerId INT;
    -- Déclaration de la variable intermédiaire pour stocker le Prix total
    DECLARE @Price DECIMAL;
    -- Déclaration de la variable pour stocker l'identifiant de la facture
    DECLARE @CreatedId INT;

    -- 1. Récupérer le CustomerId de la commande
    SELECT @CustomerId = c.Id
    FROM Customer c
    INNER JOIN Order o
	    ON o.CustomerId = c.Id
    WHERE o.Id = @OrderId;
    
    -- 2. Récupérer le prix total de la commande
    SELECT @Price = SUM(p.Price)
    FROM Product p
    INNER JOIN Order o
	    ON p.OrderId = o.Id
    WHERE o.Id = @OrderId;

    -- Vérification : si le client n'existe pas, on arrête l'exécution
    IF @CustomerId IS NULL
    BEGIN
        RETURN;
    END

    -- 3. Insérer une nouvelle commande dans la table Commandes
    INSERT INTO Invoice(CustomerId, TotalPrice)
    VALUES (@CustomerId , @Price);
		
		-- 4. Sauvegarde de l'identifiant de la facture créé
		SET @CreatedId = SCOPE_IDENTITY();
		
		-- 5. On retourne la facture créée
    SELECT * FROM Invoice WHERE Id = @CreatedId;
    
END;

Vous voyez qu’à l’intérieur de cette procédure, on utilise différentes commandes SQL ensemble, comme SELECT, INSERT, IF, SET,…

Et en plus de rassembler toutes ces commandes dans un seul bloc, cela nous permet de vérifier certaines conditions pour que nos requêtes s’exécutent correctement !

Attention néanmoins, une procédure ne fait pas office de transaction.

Exécuter une procédure

Une fois la procédure créée, vous pouvez l'exécuter avec la commande EXEC , et lui passer les paramètres nécessaires :

EXEC GenerateCustomerInvoice @OrderId = 1;

Cela exécutera les instructions SQL définies dans la procédure, et retournera le résultat issu du SELECT final de la procédure.

Si besoin, une procédure peut être appelée depuis une autre procédure, et ainsi de suite, exactement comme une fonction en programmation classique !

Modifier une procédure

Une fois votre procédure sauvegardée, si vous avez besoin de modifier son fonctionnement, vous pourrez utiliser la commande ALTER PROCEDURE, comme ceci :

ALTER PROCEDURE <ProcedureName>
    -- Liste des paramètres
AS
BEGIN
    -- Contenu de la procédure
END;

Il faudra alors repasser l’entièreté du code de la procédure modifiée !


Vous avez terminé l'article ?

Commentaires (0)

pour laisser un commentaire

Aucun commentaire pour l'instant