Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Échapper aux guillemets simples dans SQL Server

Un mot de conseil. Lorsque vous testez un script dynamique, affichez-le d'abord au lieu de l'exécuter. De cette façon, vous pourrez le voir exactement tel qu'il serait vu par le EXEC déclaration.

Passons maintenant au problème. Vous devez garder à l'esprit que vous ne transmettez pas la variable à SplitValues mais concaténent à la place la valeur de la variable dans le script. Puisque la valeur est varchar , il doit être concaténé et entouré de guillemets. Leur absence est vraiment le seul problème.

Les guillemets autour du deuxième argument, la virgule, sont échappés correctement dans les deux cas . Donc, utilisez simplement l'une des méthodes pour ajouter les guillemets autour du premier argument :

  • répétition du guillemet :

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')';
    SELECT @sql;
    
  • en utilisant CHAR(39) :

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(' + CHAR(39) + @year + CHAR(39) + ',' + CHAR(39) + ',' + CHAR(39) + ')';
    SELECT @sql;
    

Évidemment, la première méthode est plus compacte, mais, comme je l'ai dit, les deux fonctionnent bien, comme le montre clairement cette démo SQL Fiddle.

Notez, cependant, que vous pourriez facilement échapper à ce problème en premier lieu, si vous pardonnez le jeu de mots. Au lieu de EXEC () , vous pouvez utiliser EXEC sp_executesql , qui vous permet d'utiliser des paramètres . Voici le même script réécrit pour utiliser sp_executesql :

DECLARE @year varchar(max), @delim char(1);
SET @year = '111,11';
SET @delim = ',';
EXEC sp_executesql
  N'SELECT * FROM SplitValues(@year_param,@delim_param)',
  N'@year_param varchar(max), @delim_param char(1)',
  @year,@delim;

Comme vous pouvez le voir, pas besoin de s'inquiéter d'échapper aux guillemets :SQL Server se charge de substituer les valeurs correctement, pas vous.