一句忠告。测试动态脚本时,首先只显示它而不是执行它。这样,您将能够完全按照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 会费心正确地替换值,而不是您。