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:
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:
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:
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.