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.
Je vous résume brièvement ce que je pense avoir apris à partir de cet exemple :
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;
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 ?)
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
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;
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.
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;
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.
Partager