在SQL Server中如何转义单引号

21

我正在尝试执行以下语句来转义单引号(即使用两个单引号):

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呢? - Bridge
因为我现在正在处理的查询非常复杂,无法在此处发布。这只是我尝试做的事情的一瞥。 - Saksham
可能是重复的问题,参考 *在SQL Server中替换单引号*。 - Peter Mortensen
4个回答

38
一条建议。在测试动态脚本时,首先只需显示它而不执行它。这样,您将能够看到与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;
    

显然,第一种方法更紧凑,但是就像我说的那样,两种方法都能很好地工作,正如此SQL Fiddle演示所示

但是需要注意的是,如果您原先使用EXEC()可能会面临易错问题,但是您可以轻松避免这个问题。您可以使用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会正确替换值,而不是由你来完成。


抱歉,我不确定我理解了。你在这里观察到的问题是什么? - Andriy M
我想指出你最初的陈述中的讽刺之处,即你应该打印命令而不是执行它以进行验证,但是sp_executesql没有为你提供在不执行语句的情况下打印语句的选项。如果有方法,也许你应该演示一下。我猜打印语句的作用有限,因为它比其他替代方案更易读。 - ATL_DEV
如果动态查询不包含任何名称参数化(在这种情况下也没有),则它不需要由许多粘合在一起的部分构建。因此,是的,在执行之前/之代替执行时使用变量存储查询仅用于打印似乎没有太大价值。 - Andriy M
使用CHAR(39)我喜欢 - Aetos2501

16

只需要输入两次单引号:

select 'that''s it'

这是我在发布的解决方案中尝试的第一件事。 - Saksham
1
不完全正确。' + char(39) + ' 只提供了三个引号,而你需要四个。让我们尝试整个语句: exec ('SELECT * FROM SplitValues(''' + @year + ''','''','''')'); - AdamL

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,因为您可以使用参数化查询。

-1
declare @var1 varchar(100)
declare @var3 varchar(100)
declare @var4 varchar(100)

declare @var2 nvarchar(MAX)
set @var1 = ‘anil’
set @var4 =1019518594set @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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接