一条建议。在测试动态脚本时,首先只需显示它而不执行它。这样,您将能够看到与
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
代替EXEC ()
,这将允许您使用参数。下面是重写后使用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会正确替换值,而不是由你来完成。