在 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 中转义单引号的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL,如何在字符串中转义单引号?

PL/SQL,如何在字符串中转义单引号?

NamedParameterJdbcTemplate Oracle SQL,如何在命名查询中转义单引号?

如何在单引号字符串中转义单引号

如何在 MySQL 中转义单引号

如何在 Presto 中转义单引号?