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.