Uma palavra de conselho. Ao testar um script dinâmico, primeiro apenas o exiba em vez de executá-lo. Dessa forma, você poderá vê-lo exatamente como seria visto pelo
EXEC
demonstração. Agora para a questão. Você deve ter em mente que não está passando a variável para
SplitValues
mas estão concatenando o valor da variável no script. Como o valor é varchar
, ele deve ser concatenado entre aspas. A ausência deles é o único problema realmente. As aspas ao redor do segundo argumento, a vírgula, são escapadas corretamente em ambos os casos . Então, basta usar um dos métodos para adicionar as aspas ao redor do primeiro argumento:
-
repetição das aspas:
DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')'; SELECT @sql;
-
usandoCHAR(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;
Obviamente, o primeiro método é mais compacto, mas, como eu disse, ambos funcionam bem, como mostra claramente esta demonstração do SQL Fiddle.
Observe, no entanto, que você pode facilmente escapar desse problema em primeiro lugar, se você perdoar o trocadilho. Em vez de
EXEC ()
, você pode usar EXEC sp_executesql
, que permite usar parâmetros . Aqui está o mesmo script reescrito para usar 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;
Como você pode ver, não há necessidade de se preocupar em escapar das aspas:o SQL Server se dá ao trabalho de substituir os valores corretamente, não você.