IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Comment utiliser en T-SQL la fonction de formattage String avec une liste de paramètres dynamique


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Points : 500
    Points
    500
    Billets dans le blog
    1
    Par défaut Comment utiliser en T-SQL la fonction de formattage String avec une liste de paramètres dynamique
    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

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

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Personnelement, je récupèrerai la libellé tel quel et je le gèrerai dans le code de mon application. En C# par exemple, tu as String.Format() http://msdn.microsoft.com/fr-fr/libr...=vs.80%29.aspx
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  3. #3
    Membre confirmé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Points : 500
    Points
    500
    Billets dans le blog
    1
    Par défaut
    Merci pour la suggestion, mais cela n'est pas envisagable dans la cadre de notre projet, car l'application devant afficher les données doivent rester inchangé. Le code C# doit rester identique.

    Pour le moment, nous avons laissé tomber le SQL dynamique, et fait une liste de paramètres de 4 éléments sachant qu'il ne sont pas obligatoires.

    Si tu passes moins de paramètres que prévu dans xp sprintf cela passe bien.

Discussions similaires

  1. [Débutant] Comment utiliser les requete SQL est afficher les resultat sur Gridview
    Par likoo_01 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 15/04/2012, 10h49
  2. comment utiliser le callback de la fonction animate()
    Par atjtwooo dans le forum jQuery
    Réponses: 1
    Dernier message: 07/11/2009, 21h35
  3. comment utiliser SELECT COUNT dans ma fonction
    Par z_ahlam dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2009, 16h30
  4. Réponses: 5
    Dernier message: 18/01/2007, 20h09
  5. [VB.NET] Comment utiliser un fichier .sql ?
    Par prophetky dans le forum VB.NET
    Réponses: 7
    Dernier message: 14/04/2006, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo