Един съвет. Когато тествате динамичен скрипт, първо просто го покажете, вместо да го изпълнявате. По този начин ще можете да го видите точно както би се виждал от EXEC
изявление.
Сега към въпроса. Трябва да имате предвид, че не предавате променливата към SplitValues
но вместо това свързват стойността на променливата в скрипта. Тъй като стойността е 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
, което ви позволява да използвате параметри . Ето същия скрипт, пренаписан за използване на 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 се затруднява да замени стойностите правилно, а не вие.