Ответ 1
Слово совета. При тестировании динамического script сначала просто отобразите его вместо его выполнения. Таким образом, вы сможете увидеть его точно так, как это было бы видно в инструкции EXEC
.
Теперь о проблеме. Вы должны иметь в виду, что вы не передаете переменную в SplitValues
, а вместо этого объединяете значение переменной в script. Поскольку значение varchar
, оно должно быть конкатенировано с кавычками вокруг него. Отсутствие их - единственная проблема на самом деле.
В обоих случаях кавычки вокруг второго аргумента, запятая, сбрасываются правильно. Итак, просто используйте любой из методов для добавления котировок вокруг первого аргумента:
-
повторение кавычки:
DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')'; SELECT @sql;
-
с помощью
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;
Очевидно, что первый метод более компактный, но, как я уже сказал, оба хорошо работают, поскольку эта демонстрация SQL Fiddle ясно показывает.
Обратите внимание, однако, что вы могли бы легко избежать этой проблемы в первую очередь, если вы прощаете каламбур. Вместо EXEC ()
вы можете использовать EXEC sp_executesql
, который позволяет использовать параметры. Здесь же script переписан для использования 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;
Как вы можете видеть, не нужно беспокоиться о том, чтобы избежать кавычек: SQL Server не может заменить значения правильно, а не вы.