IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

La procédure sp_ExecuteSQL


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2008
    Messages : 59
    Points : 52
    Points
    52
    Par défaut La procédure sp_ExecuteSQL
    Bonjour,
    j'utilise la documentation en ligne de SQL Server 2005, dans le but de mieux comprendre le principe de fonctionnement de la procédure sp_ExecuteSQL. Cette documentation très pratique, ne suffit malheureursement pas toujours. Ci-dessous vous trouverez le code qui accompagne l'explication qui m'est fournie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    01  DECLARE @IntVariable int;
    02  DECLARE @SQLString nvarchar(500);
    03  DECLARE @ParmDefinition nvarchar(500);
    04
    05  /* Build the SQL string one time.*/
    06  SET @SQLString =
    07  N'SELECT * FROM AdventureWorks.HumanResources.Employee 
    08  WHERE ManagerID = @ManagerID';
    09  SET @ParmDefinition = N'@ManagerID tinyint';
    10  /* Execute the string with the first parameter value. */
    11  SET @IntVariable = 197;
    12  EXECUTE sp_executesql @SQLString, @ParmDefinition, @ManagerID = @IntVariable;
    13  /* Execute the same string with the second parameter value. */
    14  SET @IntVariable = 109;
    15  EXECUTE sp_executesql @SQLString, @ParmDefinition,
                          @ManagerID = @IntVariable;
    Je vous résume brièvement ce que je pense avoir apris à partir de cet exemple :
    1°. La chaîne @SQL contient une requête au format unicode dans laquelle le paramètre formel @ManagerID est mentionné
    2°. La déclaration, au format unicode, de ce paramètre est contenue dans la variable @ParmDefinition
    3°. Lors de l'exécution (EXEC sp_ExecuteSQL) :
    3-1. la requête contenu dans @SQL est exécutée (pourtant @ManagerID n'a pas encore été déclaré ?)
    3-2. la définition contenue dans @ParmDefinition est interprétée puis exécutée (mais trop tard puique @ManagerID a déjà été utilisé ?)
    3-3. on initialise le paramètre @ManagerID avec le contenu de la variable @IntVariable (mais cette fois-ci encore trop tardivement puisque le paramètre à déjà été utilisé dans la requête ?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    01  DECLARE @IntVariable int;
    02  DECLARE @SQLString nvarchar(500);
    03  DECLARE @ParmDefinition nvarchar(500);
    04  DECLARE @max_title varchar(30);
    05
    06  SET @IntVariable = 197;
    07  SET @SQLString = N'SELECT @max_titleOUT = max(Title) 
    08  FROM AdventureWorks.HumanResources.Employee
    09  WHERE ManagerID = @level';
    10  SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';
    11
    12  EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
    13  SELECT @max_title;
    Dans ce second exemple, je n'arrive pas à comprendre la ligne 12 : pourquoi affecte-t-on au paramètre @max_titleOUT la valeur de la variable @max_title. A mon avis, la logique voudrais que l'on inverse l'ordre de l'affectation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    12  EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_title = @max_titleOUT OUTPUT;
    13  SELECT @max_title;
    Je me perd un peu dans la logique de cette procédure et je souhaiterais que l'on m'apporte un peu d'aide, merci.

    P.S : Le reste de la documentation concernant la procédure sp_ExecuteSQL se trouve à l'adresse suivante : ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.fr/tsqlref9/html/a8d68d72-0f4d-4ecb-ae86-1235b962f646.htm, merci.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    01 DECLARE @IntVariable int;02 DECLARE @SQLString nvarchar(500);03 DECLARE @ParmDefinition nvarchar(500);04 DECLARE @max_title varchar(30);0506 SET @IntVariable = 197;07 SET @SQLString = N'SELECT @max_titleOUT = max(Title) 08 FROM AdventureWorks.HumanResources.Employee09 WHERE ManagerID = @level';10 SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';1112 EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;13 SELECT @max_title;
    EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
    13 SELECT @max_title;

    @SQLString la requete sous forme de chaine.
    @ParamDefinition la definition des variables sous forme de chaine.
    "@level = @IntVariable, @max_titleOUT=@max_title OUTPUT" declaration des parametres : @level parametre d'entre. @max_titleOUT parametre de sortie.

    @level = @intvariable = 197.
    @max_title = @max_titleOUT = max(Title)
    08 FROM AdventureWorks.HumanResources.Employee
    09 WHERE ManagerID = 197'
    ;

    13 SELECT @max_title;

    ligne 13, j'affiche la variable de sortie de la procedure.

    sp_executesql est une procedure qui permet de faire la meme chose que ce que font les developpeurs generalement par l'usage de sql dynamique.

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  3. ProgressBar avec plusieurs procédures
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 08/09/2002, 18h03
  4. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo