在SQL Server中转义单引号

Sak*_*ham 16 sql-server

我试图执行以下语句来逃避单引号(即使用两个单引号):

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无需正确替换值,而不是您.


Ada*_*ski 12

只需输入两次单引号:

select 'that''s it'
Run Code Online (Sandbox Code Playgroud)