我试图执行以下语句来转义单引号(即使用两个单引号):
declare @year varchar(max) set @year = '111,11'; exec ('SELECT * FROM SplitValues(' + @year + ','','')');
我甚至尝试使用char(39)而不是引号:
declare @year varchar(max) set @year = '111,' + char(39) + ',' + char(39) + ')');
但这没有帮助.这是我在本网站上发现的唯一两个解决方案.任何帮助?
这是简化的查询以清除所有问题:
declare @year varchar(max) set @year = '111,11'; SELECT * FROM SplitValues(@year,',')
我想实现这一点,但是使用动态查询.
解决方法
一个忠告的话.测试动态脚本时,首先只显示它,而不是执行它.这样你就可以看到它完全像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),11'; SET @sql = 'SELECT * FROM SplitValues(' + CHAR(39) + @year + CHAR(39) + ',' + CHAR(39) + ',' + CHAR(39) + ')'; SELECT @sql;
显然,第一种方法比较紧凑,但是像我所说的那样,两者都很好,正如this SQL Fiddle demo所示.
但是,请注意,如果您原谅双关语,您可以轻松逃脱这个问题.而不是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需要正确替换值的麻烦,而不是你.