Bonsoir à tous, merci d'abord de souhaiter m'aider
Mon besoin est le suivant j'ai des messages en base avec des emplacements pour les paramètres.
Par exemple:
"Le client de numéro %s et son téléphone est %s" où %s sera remplacé par les paramètres respectifs attendus (numéro client, téléphone).
Mon but est de rendre la liste de paramètres dynamique et de remplacer chacun des emplacements par ces paramètres.
J'ai donc utilisé la notion de requête dynamique.
Cela fonctionne bien quand un seul paramètre est attendu mais cela plante avec plusieurs.
J'ai réussi à corriger et cela fonctionne, seulement j'ai dû mettre directement la liste des paramètres en concaténation et je risque l'injection SQL. J'ai essayé d'utiliser la liste de paramètres en tant que paramètre dans sp-executesql.
Seulement je tombe sur l'erreur :
Erreur lors de l'exécution de la procédure stockée étendue: paramètre non valide.
Je pense que cela est du au fait que la liste de paramètres que j' "injecte" en tant que paramètre pour sp_executesql est quand même considérée comme un seul paramètre au lieu d'une liste de plusieurs paramètres au moment d'exécuter xp_sprintf
Avez-vous une solution que je puisse éviter le risque d'injection SQL avec l'utilisation propre?
Merci beaucoup
Le code qui fonctionne
Le code qui ne fonctionne pas
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
18
19
20
21
22
23
24 DECLARE @statement nvarchar(max) SET @statement = ' DECLARE @MessageContent nvarchar(250) SELECT @MessageContent = Message from Error WHERE ERRORID=@CodeMessage PRINT ''MessageContent ==> '' + @MessageContent EXEC xp_sprintf @MessageContent out, @MessageContent,' + @PARAMETERS + ' print ''MessageContent After ==> '' + @MessageContent INSERT INTO Message(LineID,ErrorId,Message,Parameters)VALUES(@LineId, @CodeMessage, @MessageContent, @PARAMETERS) ' EXECUTE sp_executesql @statement, N'@LineId INT, @CodeMessage nvarchar(500), @PARAMETERS nvarchar(500)', @LineId, @CodeMessage, @PARAMETERS
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
18
19
20
21
22
23
24 DECLARE @statement nvarchar(max) SET @statement = ' DECLARE @MessageContent nvarchar(250) SELECT @MessageContent = Message from Error WHERE ERRORID=@CodeMessage PRINT ''MessageContent ==> '' + @MessageContent EXEC xp_sprintf @MessageContent out, @MessageContent,@PARAMETERS print ''MessageContent After ==> '' + @MessageContent INSERT INTO Message(LineID,ErrorId,Message,Parameters)VALUES(@LineId, @CodeMessage, @MessageContent, @PARAMETERS) ' EXECUTE sp_executesql @statement, N'@LineId INT, @CodeMessage nvarchar(500), @PARAMETERS nvarchar(500)', @LineId, @CodeMessage, @PARAMETERS
Partager