20

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

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

4 回答 4

35

一句忠告。测试动态脚本时,首先只显示它而不是执行它。这样,您将能够完全按照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,它允许你使用参数。这是重写使用的相同脚本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 会费心正确地替换值,而不是您。

于 2013-03-15T21:23:47.013 回答
15

只需输入两次单引号:

select 'that''s it'
于 2013-03-14T12:16:21.203 回答
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

实际上,finally 选择你会使用exec()。但是你真的应该使用sp_sqlexecute这样的东西,因为你可以使用参数化查询。

于 2013-03-14T21:42:32.133 回答
-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
于 2019-12-10T10:04:25.710 回答