none
Problème de caractère d'échappement dans un script RRS feed

  • Question

  • Bonjour à tous,

    J'ai un problème de caractère d'échappement dans un script que je n'arrive pas à résoudre. J'ai simplifié le script de la façon suivante pour montrer le problème :

    declare @tab varchar(max)='matable',  @query varchar(max),  
    --@whereClause varchar(max)=' where country=''Suisse''';
    @whereClause varchar(max)='';
    
    SELECT @query = 
    'SELECT * From ' + @tab + @whereClause
    +''
    ; 
    
    exec (@query);
    

    Je voudrais simplement avoir une clause where, mais dès que dans la condition j'ai un varchar entre cote, ça ne marche plus. J'ai essayé de doubler les cotes, de mettre des guillemets, de définir le caractère d'échappement, mais rien n'y fait..

    Quelqu'un peut m'aider ?

    jeudi 21 juin 2018 14:36

Réponses

  • Bonjour,

    En TSQL l'échappement d'une quote est de la doubler.

    Maintenant si je comprends bien votre problème c'est le cas où une valeur dans votre condition ("Suisse" dans votre exemple), contient une quote ?

    Vous avez deux possibilités pour cela:

    • Utiliser la fonction REPLACE(@value, '''', '''''') pour double-quoter les quotes dans votre valeur
    • Utiliser la fonction sp_executesql avec utilisation de variable pour que SQL les transforme correctement
    declare @tab varchar(max)='matable'
    , @query nvarchar(max)
    , @val varchar(max) = 'Suisse'
    , @whereClause varchar(max)=''
    
    -- Test avec REPLACE
    SELECT @whereClause = ' where country='''+REPLACE(@val, '''', '''''')+''''
    SELECT @query = 'SELECT * From ' + @tab + @whereClause 
    exec (@query);
    
    -- Test avec sp_execute
    SELECT @whereClause = ' where country=@val';
    SELECT @query = 'SELECT * From ' + @tab + @whereClause; 
    exec sp_executesql @query, N'@val varchar(max)', @val = @val
    

    ATTENTION: sp_executesql a besoin que @query soit un nvarchar (varchar unicode)

    De manière générale la seconde option est préférable car elle permet de protéger tous les types de données (date, texte, nombre, etc.)

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse JosephDB vendredi 22 juin 2018 07:37
    vendredi 22 juin 2018 06:47

Toutes les réponses

  • Bonjour,

    En TSQL l'échappement d'une quote est de la doubler.

    Maintenant si je comprends bien votre problème c'est le cas où une valeur dans votre condition ("Suisse" dans votre exemple), contient une quote ?

    Vous avez deux possibilités pour cela:

    • Utiliser la fonction REPLACE(@value, '''', '''''') pour double-quoter les quotes dans votre valeur
    • Utiliser la fonction sp_executesql avec utilisation de variable pour que SQL les transforme correctement
    declare @tab varchar(max)='matable'
    , @query nvarchar(max)
    , @val varchar(max) = 'Suisse'
    , @whereClause varchar(max)=''
    
    -- Test avec REPLACE
    SELECT @whereClause = ' where country='''+REPLACE(@val, '''', '''''')+''''
    SELECT @query = 'SELECT * From ' + @tab + @whereClause 
    exec (@query);
    
    -- Test avec sp_execute
    SELECT @whereClause = ' where country=@val';
    SELECT @query = 'SELECT * From ' + @tab + @whereClause; 
    exec sp_executesql @query, N'@val varchar(max)', @val = @val
    

    ATTENTION: sp_executesql a besoin que @query soit un nvarchar (varchar unicode)

    De manière générale la seconde option est préférable car elle permet de protéger tous les types de données (date, texte, nombre, etc.)

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse JosephDB vendredi 22 juin 2018 07:37
    vendredi 22 juin 2018 06:47
  • Bonjour Yan,

    Merci beaucoup d'avoir pris le temps pour cette réponse bien détaillée. Non, mon problème était simplement avec un cas comme Suisse sans quote.

    Ça fonctionne parfaitement en effet.

    Bonne journée !

    vendredi 22 juin 2018 07:37