Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur d'exécution d'un code sql dynamique.

1 réponse
Avatar
ML
Bonjour,

Je cherche une solution pour résoudre le problème suivant :
Pouvoir prendre en compte la valeur d'une colonne d'une table dont le nom
est paramétrable.

Pour le réaliser, j'ai tenté de l'implémenter à partir d'un code Sql
dynamique, mais sans y parvenir.
J'obtiens l'erreur suivante :

Serveur : Msg 245, Niveau 16, État 1, Ligne 1
Échec de la conversion de la valeur varchar « COL01 » en type de données
int.

Je ne sais si l'utilisation de Sql dynamique est le bon choix dans ce cas de
figure.

Ci-dessous le contexte :

Pour l'exemple, j'ai créé une table temporaire, de la structure ci-dessous :

Create table #MyTable (
CLE VARCHAR (10),
Col01 int,
Col02 int,
Col03 int,
Col04 int
)

Cette table contient un enregistrement, inséré comme ci-dessous :

insert into #MyTable (CLE, Col01, Col02, Col03, Col04)
Values ('0001',
1,
2,
3,
4)

Les valeurs insérées peuvent être listées par la requête ci-dessous :

/*-----------------------------
select * from #MyTable;
-----------------------------*/
CLE;Col01;Col02;Col03;Col04
0001;1;2;3;4

(1 ligne(s) affectée(s))

Ci-dessous, le code utilisé :

Declare @Str_Sql nvarchar (255);
Declare @Str_Para nvarchar (255);
Declare @Val_Cpt int;
Declare @Nam_Data nvarchar (10);
Declare @Var_Cle nvarchar (4);

Select @Var_Cle = '0001';
Select @Nam_Data = 'COL01';


Select @Str_Sql = N'Select @P_Val = Max (@P_Name) From #MyTable' +
' Where CLE = @Var_Clep';
SET @Str_Para = N'@P_Val Int Output, @P_Name varchar (10), @Var_Clep varchar
(4)';

--Print @Str_Sql


Execute sp_executesql @Str_Sql, @Str_Para, @P_Val=@Val_Cpt Output,
@P_Name=@Nam_Data, @Var_Clep=@Var_Cle;



L'exécution de ce code provoque l'erreur suivante :

Serveur : Msg 245, Niveau 16, État 1, Ligne 1
Échec de la conversion de la valeur varchar « COL01 » en type de données
int.


Le but que je cherche à atteindre est de passer en paramètre le nom de la
colonne : COL01, COL02, COL03, COL04, afin de prendre en compte la valeur
correspondant la colonne souhaitée.


Voyez-vous une erreur dans ce code ?

La solution à ce problème est t'elle autour du sql dynamique ou autre
méthode ?


D'avance merci pour toute information.

Cordialement.

MhL

1 réponse

Avatar
Fred BROUARD
Declare @Str_Sql nvarchar (4000);
Declare @Str_Para nvarchar (4000);
Declare @Val_Cpt int;
Declare @Nam_Data nvarchar (128);
Declare @Var_Cle nchar (4);

Select @Var_Cle = '0001';
Select @Nam_Data = 'Col01';


SET @Str_Sql = N'Select @P_Val = Max (' + @Nam_Data + ' ) From #MyTable
Where CLE = ''' + CAST(@Var_Cle AS VARCHAR(32))+ '''';
SET @Str_Para = N'@P_Val Int Output';

Print @Str_Sql

Execute sp_executesql @Str_Sql, @Str_Para, @P_Val=@Val_Cpt Output;

SELECT @Val_Cpt AS RESULTAT

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************



ML a écrit :
Bonjour,

Je cherche une solution pour résoudre le problème suivant :
Pouvoir prendre en compte la valeur d'une colonne d'une table dont le nom
est paramétrable.

Pour le réaliser, j'ai tenté de l'implémenter à partir d'un code Sql
dynamique, mais sans y parvenir.
J'obtiens l'erreur suivante :

Serveur : Msg 245, Niveau 16, État 1, Ligne 1
Échec de la conversion de la valeur varchar « COL01 » en type de données
int.

Je ne sais si l'utilisation de Sql dynamique est le bon choix dans ce cas de
figure.

Ci-dessous le contexte :

Pour l'exemple, j'ai créé une table temporaire, de la structure ci-dessous :

Create table #MyTable (
CLE VARCHAR (10),
Col01 int,
Col02 int,
Col03 int,
Col04 int
)

Cette table contient un enregistrement, inséré comme ci-dessous :

insert into #MyTable (CLE, Col01, Col02, Col03, Col04)
Values ('0001',
1,
2,
3,
4)

Les valeurs insérées peuvent être listées par la requête ci-dessous :

/*-----------------------------
select * from #MyTable;
-----------------------------*/
CLE;Col01;Col02;Col03;Col04
0001;1;2;3;4

(1 ligne(s) affectée(s))

Ci-dessous, le code utilisé :

Declare @Str_Sql nvarchar (255);
Declare @Str_Para nvarchar (255);
Declare @Val_Cpt int;
Declare @Nam_Data nvarchar (10);
Declare @Var_Cle nvarchar (4);

Select @Var_Cle = '0001';
Select @Nam_Data = 'COL01';


Select @Str_Sql = N'Select @P_Val = Max (@P_Name) From #MyTable' +
' Where CLE = @Var_Clep';
SET @Str_Para = N'@P_Val Int Output, @P_Name varchar (10), @Var_Clep varchar
(4)';

--Print @Str_Sql


Execute sp_executesql @Str_Sql, @Str_Para, @P_Val=@Val_Cpt Output,
@P_Name=@Nam_Data, @Var_Clep=@Var_Cle;



L'exécution de ce code provoque l'erreur suivante :

Serveur : Msg 245, Niveau 16, État 1, Ligne 1
Échec de la conversion de la valeur varchar « COL01 » en type de données
int.


Le but que je cherche à atteindre est de passer en paramètre le nom de la
colonne : COL01, COL02, COL03, COL04, afin de prendre en compte la valeur
correspondant la colonne souhaitée.


Voyez-vous une erreur dans ce code ?

La solution à ce problème est t'elle autour du sql dynamique ou autre
méthode ?


D'avance merci pour toute information.

Cordialement.

MhL