Recherche…


Introduction

Dans SQL Server, une procédure est un programme stocké dans lequel vous pouvez transmettre des paramètres. Il ne renvoie pas de valeur comme le fait une fonction. Cependant, il peut renvoyer un état de réussite / échec à la procédure qui l'a appelé.

Syntaxe

  • CREATE {PROCEDURE | PROC} [nom_schéma.] Nom_procédure
  • [@parameter [type_schema_name.] type de données
  • [VARYING] [= par défaut] [OUT | SORTIE | LECTURE SEULEMENT ]
  • , @parameter [type_schema_name.] type de données
  • [VARYING] [= par défaut] [OUT | SORTIE | LECTURE SEULEMENT ] ]
  • [AVEC {CRYPTAGE | RECOMPILE | EXECUTE AS Clause}]
  • [POUR RÉPLICATION]
  • COMME
  • COMMENCER
  • [déclaration_section]
  • exécutable_section
  • FIN;

Créer et exécuter une procédure stockée de base

Utilisation de la table des Authors dans la base de données de la bibliothèque

CREATE PROCEDURE GetName
(
    @input_id INT = NULL,      --Input parameter,  id of the person, NULL default
    @name VARCHAR(128) = NULL  --Input parameter, name of the person, NULL default
) 
AS
BEGIN 
    SELECT Name + ' is from ' + Country 
    FROM Authors 
    WHERE Id = @input_id OR Name = @name
END 
GO

Vous pouvez exécuter une procédure avec plusieurs syntaxes différentes. Tout d'abord, vous pouvez utiliser EXECUTE ou EXEC

EXECUTE GetName @id = 1
EXEC Getname @name = 'Ernest Hemingway'

De plus, vous pouvez omettre la commande EXEC. De plus, vous n'avez pas besoin de spécifier le paramètre que vous transmettez, lorsque vous transmettez tous les paramètres.

GetName NULL, 'Ernest Hemingway'

Lorsque vous souhaitez spécifier les paramètres d'entrée dans un ordre différent de celui dans lequel ils ont été déclarés dans la procédure, vous pouvez spécifier le nom du paramètre et affecter des valeurs. Par exemple

 CREATE PROCEDURE dbo.sProcTemp 
 (
    @Param1 INT,
    @Param2 INT
)
AS
BEGIN

    SELECT
        Param1 = @Param1,
        Param2 = @Param2

END

l'ordre normal d'exécution de cette procédure est de spécifier la valeur pour @ Param1 d'abord, puis @ Param2 seconde. Donc ça va ressembler à ça

  EXEC dbo.sProcTemp @Param1 = 0,@Param2=1

Mais il est également possible que vous puissiez utiliser les éléments suivants

  EXEC dbo.sProcTemp @Param2 = 0,@Param1=1

dans ce cas, vous spécifiez la valeur pour @ param2 en premier et @ Param1 seconde. Ce qui signifie que vous n'avez pas à conserver le même ordre que celui déclaré dans la procédure, mais vous pouvez avoir n'importe quelle commande comme vous le souhaitez. mais vous devrez spécifier à quel paramètre vous définissez la valeur

Accéder à la procédure stockée à partir de n'importe quelle base de données

Et vous pouvez également créer une procédure avec un préfixe sp_ ces procédures, comme toutes les procédures stockées du système, peuvent être exécutées sans spécifier la base de données en raison du comportement par défaut de SQL Server. Lorsque vous exécutez une procédure stockée commençant par "sp_", SQL Server recherche d'abord la procédure dans la base de données master. Si la procédure est introuvable dans master, elle recherche dans la base de données active. Si vous avez une procédure stockée à laquelle vous souhaitez accéder depuis toutes vos bases de données, créez-la dans master et utilisez un nom incluant le préfixe "sp_".

Use Master

CREATE PROCEDURE sp_GetName
(
    @input_id INT = NULL,      --Input parameter,  id of the person, NULL default
    @name VARCHAR(128) = NULL  --Input parameter, name of the person, NULL default
) 
AS
BEGIN 
    SELECT Name + ' is from ' + Country 
    FROM Authors 
    WHERE Id = @input_id OR Name = @name
END 
GO

PROCÉDURE STOCKÉE avec paramètres OUT

Les procédures stockées peuvent renvoyer des valeurs à l'aide du mot clé OUTPUT dans sa liste de paramètres.

Création d'une procédure stockée avec un seul paramètre de sortie

CREATE PROCEDURE SprocWithOutParams
(
    @InParam VARCHAR(30),
    @OutParam VARCHAR(30) OUTPUT
)
AS
BEGIN
    SELECT @OutParam = @InParam + ' must come out'   
    RETURN
END   
GO

Exécuter la procédure stockée

DECLARE @OutParam VARCHAR(30)    
EXECUTE SprocWithOutParams 'what goes in', @OutParam OUTPUT   
PRINT @OutParam 

Création d'une procédure stockée avec plusieurs paramètres sortants

CREATE PROCEDURE SprocWithOutParams2
(
    @InParam VARCHAR(30),
    @OutParam VARCHAR(30) OUTPUT,
    @OutParam2 VARCHAR(30) OUTPUT
)
AS
BEGIN
    SELECT @OutParam = @InParam +' must come out'   
    SELECT @OutParam2 = @InParam +' must come out'
    RETURN
END    
GO

Exécuter la procédure stockée

DECLARE @OutParam VARCHAR(30)    
DECLARE @OutParam2 VARCHAR(30)  
EXECUTE SprocWithOutParams2 'what goes in', @OutParam OUTPUT, @OutParam2 OUTPUT   
PRINT @OutParam 
PRINT @OutParam2

Procédure stockée avec If ... Else et Insert In operation

Créer une table exemple Employee :

CREATE TABLE Employee
(
    Id INT,
    EmpName VARCHAR(25),
    EmpGender VARCHAR(6),
    EmpDeptId INT
)

Crée une procédure stockée qui vérifie si les valeurs transmises dans la procédure stockée ne sont pas nulles ou non et effectuent une opération d'insertion dans la table Employee.

CREATE PROCEDURE spSetEmployeeDetails
(
    @ID int,
    @Name VARCHAR(25),
    @Gender VARCHAR(6),
    @DeptId INT
)
AS
BEGIN
    IF (
        (@ID IS NOT NULL AND LEN(@ID) !=0) 
        AND (@Name IS NOT NULL AND LEN(@Name) !=0)
        AND (@Gender IS NOT NULL AND LEN(@Gender) !=0)
        AND (@DeptId IS NOT NULL AND LEN(@DeptId) !=0)
    )
    BEGIN
        INSERT INTO Employee
        (
            Id,
            EmpName,
            EmpGender,
            EmpDeptId
        )
        VALUES
        (
            @ID,
            @Name,
            @Gender,
            @DeptId
        )
    END
ELSE
    PRINT 'Incorrect Parameters'
END
GO

Exécuter la procédure stockée

DECLARE @ID INT,
    @Name VARCHAR(25),
    @Gender VARCHAR(6),
    @DeptId INT

EXECUTE spSetEmployeeDetails
    @ID = 1,
    @Name = 'Subin Nepal',
    @Gender = 'Male',
    @DeptId = 182666 

SQL dynamique dans la procédure stockée

SQL dynamique nous permet de générer et d'exécuter des instructions SQL au moment de l'exécution. Le SQL dynamique est nécessaire lorsque nos instructions SQL contiennent un identifiant susceptible de changer à différents moments de la compilation.

Exemple simple de SQL dynamique:

CREATE PROC sp_dynamicSQL
@table_name      NVARCHAR(20),
@col_name        NVARCHAR(20), 
@col_value       NVARCHAR(20) 
AS
BEGIN
DECLARE  @Query  NVARCHAR(max)
SET      @Query = 'SELECT * FROM ' + @table_name
SET      @Query = @Query + ' WHERE ' + @col_name + ' = ' + ''''+@col_value+''''
EXEC     (@Query)
END

Dans la requête SQL ci-dessus, nous pouvons voir que nous pouvons utiliser la requête ci-dessus en définissant des valeurs dans @table_name, @col_name, and @col_value au moment de l'exécution. La requête est générée à l'exécution et exécutée. C'est une technique dans laquelle nous pouvons créer des scripts entiers sous forme de chaîne dans une variable et l'exécuter. Nous pouvons créer des requêtes plus complexes en utilisant le concept SQL dynamique et le concept de concaténation. Ce concept est très puissant lorsque vous souhaitez créer un script pouvant être utilisé dans plusieurs conditions.

Exécution de la procédure stockée

DECLARE @table_name     NVARCHAR(20) = 'ITCompanyInNepal',
        @col_name       NVARCHAR(20) = 'Headquarter',
        @col_value      NVARCHAR(20) = 'USA'
    
EXEC    sp_dynamicSQL   @table_name,    
                        @col_name,
                        @col_value

Tableau que j'ai utilisé

entrer la description de l'image ici

Sortie

entrer la description de l'image ici

Boucle simple

Premièrement, #systables des données dans une table temporaire nommée #systables et un numéro de ligne incrémenté afin de pouvoir interroger un enregistrement à la fois

select
    o.name,
    row_number() over (order by o.name) as rn
into
    #systables
from
    sys.objects as o
where
    o.type = 'S'

Ensuite, nous déclarons des variables pour contrôler la boucle et stocker le nom de la table dans cet exemple

declare
    @rn int = 1,
    @maxRn int = (
                    select
                        max(rn)
                    from
                        #systables as s
                    )
declare    @tablename sys name

Maintenant, nous pouvons faire une boucle en utilisant un simple moment. Nous incrémentons @rn dans l'instruction select , mais cela pourrait aussi être une instruction séparée pour ex set @rn = @rn + 1 cela dépendra de vos besoins. Nous utilisons également la valeur de @rn avant de l'incrémenter pour sélectionner un seul enregistrement de #systables . Enfin, nous imprimons le nom de la table.

while @rn <= @maxRn
    begin

        select
            @tablename = name,
            @rn = @rn + 1
        from
            #systables as s
        where
            s.rn = @rn

        print @tablename
    end

Boucle simple

CREATE PROCEDURE SprocWithSimpleLoop
(
    @SayThis VARCHAR(30),
    @ThisManyTimes INT
)
AS
BEGIN
    WHILE @ThisManyTimes > 0
    BEGIN
        PRINT @SayThis;
        SET @ThisManyTimes = @ThisManyTimes - 1;
    END
    
    RETURN;
END    
GO


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow