在SQL Server中转义单引号

时间:2013-03-14 12:12:27

标签: sql-server

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

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 , ',')

我想实现这一点,但使用动态查询。

4 个答案:

答案 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