在 SQL Server 中转义单引号
Posted
技术标签:
【中文标题】在 SQL Server 中转义单引号【英文标题】:Escaping single quote in SQL Server 【发布时间】:2013-03-14 12:12:26 【问题描述】:我试图执行以下语句来转义单引号(即使用两个单引号):
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 , ',')
我想实现这一点,但使用动态查询。
【问题讨论】:
这里为什么需要使用 EXEC? 这是因为我现在正在处理的查询非常复杂,无法在此处发布。这只是我想要做的一瞥。 Replace single quotes in SQL Server 的可能副本。 【参考方案1】:忠告。测试动态脚本时,首先只显示它而不是执行它。这样您就可以看到它与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 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 负责正确替换值,而不是您。
【讨论】:
抱歉,我不确定我是否理解。您在这里观察到的问题是什么? 我想指出您最初声明中的讽刺之处,即您应该打印命令而不是执行它以进行验证,但是 sp_executesql 没有为您提供打印语句而不执行它的选项。如果有办法,也许你应该演示一下。我想打印出该语句的实用性有限,因为它比替代方案更具可读性。 如果动态查询不包含任何名称参数化(在本例中没有),则不需要将许多部分粘合在一起。所以是的,使用变量来存储查询只是为了在执行之前/而不是在执行之前打印它似乎没有什么价值。 使用我喜欢的 CHAR (39)【参考方案2】:只需输入两次单引号:
select 'that''s it'
【讨论】:
这是我尝试的第一件事,正如您在我发布的解决方案中看到的那样。 不完全是。 ' + char(39) + ' 给你三个引号,而你需要四个。让我们试试整个语句: exec ('SELECT * FROM SplitValues(''' + @year + ''','''','''')');【参考方案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
来处理此类问题,因为您可以使用参数化查询。
【讨论】:
【参考方案4】: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
【讨论】:
以上是关于在 SQL Server 中转义单引号的主要内容,如果未能解决你的问题,请参考以下文章