我试图执行以下语句来转义单引号(即使用两个单引号):
declare @year varchar(max)
set @year = '111,11';
exec ('SELECT * FROM SplitValues(' + @year + ','','')');
我甚至尝试使用char(39)
而不是引号:
declare @year varchar(max)
set @year = '111,11';
exec ('SELECT * FROM SplitValues(' + @year + ',' + char(39) + ',' + char(39) + ')');
但它没有帮助。这是我在这个网站上找到的唯一两个解决方案。有什么帮助吗?
这是简化查询以清除您的所有问题:
declare @year varchar(max)
set @year = '111,11';
SELECT * FROM SplitValues(@year , ',')
我想实现这一点,但使用动态查询。
答案 0 :(得分:26)
一句忠告。测试动态脚本时,首先只显示它而不是执行它。通过这种方式,您将能够完全像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;
显然,第一种方法更紧凑,但正如我所说,两者都运作良好,正如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无需正确替换值,而不是您。
答案 1 :(得分:12)
只需输入两次单引号:
select 'that''s it'
答案 2 :(得分:3)
好的......你想要这个字符串:
SELECT * FROM SplitValues(@year , ',')
并将其设为如下字符串:
'SELECT * FROM SplitValues('111,11' , '','')'
所以,你的最终代码是:
declare @year varchar(max), @sql varchar(max)
set @year = '111,11';
set @sql = 'SELECT * FROM SplitValues(''' + @year + ''' , '''','''')'
select @sql
实际上,最后选择你会使用exec()
代替。但是你真的应该使用sp_sqlexecute
这样的东西,因为你可以使用参数化的查询。
答案 3 :(得分:-1)
declare @var1 varchar(100)
declare @var3 varchar(100)
declare @var4 varchar(100)
declare @var2 nvarchar(MAX)
set @var1 = ‘anil’
set @var4 = ‘1019518594’
set @var2 = N’select
a.*
from card b
join log a on a.Cust = b.ID
where a.c = ”’ + @var1 + ”’ and b.s =”’+ @var4 +””
print(@var2)
exec sp_executesql @var2