我试图执行以下语句来逃避单引号(即使用两个单引号):
declare @year varchar(max)
set @year = '111,11';
exec ('SELECT * FROM SplitValues(' + @year + ','','')');
Run Code Online (Sandbox Code Playgroud)
我甚至尝试使用char(39)
而不是引号:
declare @year varchar(max)
set @year = '111,11';
exec ('SELECT * FROM SplitValues(' + @year + ',' + char(39) + ',' + char(39) + ')');
Run Code Online (Sandbox Code Playgroud)
但它没有帮助.这是我在这个网站上找到的唯一两个解决方案.有帮助吗?
这是简化查询以清除您的所有问题:
declare @year varchar(max)
set @year = '111,11';
SELECT * FROM SplitValues(@year , ',')
Run Code Online (Sandbox Code Playgroud)
我想实现这一点,但使用动态查询.
And*_*y M 26
一句忠告.测试动态脚本时,首先只显示它而不是执行它.这样你就可以完全按照EXEC
声明的方式看到它.
现在问题.您应该记住,您没有将变量传递给SplitValues
,而是将变量的值连接到脚本中.由于值是varchar
,它应该与它周围的引号连接.缺少它们是唯一的问题.
在两种情况下,第二个参数(逗号)周围的引号都会正确转义.因此,只需使用其中一种方法在第一个参数周围添加引号:
重复引号:
DECLARE @year varchar(max), @sql varchar(max);
SET @year = '111,11';
SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')';
SELECT @sql;
Run Code Online (Sandbox Code Playgroud)使用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;
Run Code Online (Sandbox Code Playgroud)显然,第一种方法更紧凑,但是,就像我说的,两者都运行良好,正如这个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;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,无需担心转义引号:SQL Server无需正确替换值,而不是您.
归档时间: |
|
查看次数: |
69021 次 |
最近记录: |