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.