Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中转义单引号_Sql Server - Fatal编程技术网

Sql server 在SQL Server中转义单引号

Sql server 在SQL Server中转义单引号,sql-server,Sql Server,我试图执行以下语句以转义单引号(即使用两个单引号): 我甚至试着用char(39)代替引号: declare @year varchar(max) set @year = '111,11'; exec ('SELECT * FROM SplitValues(' + @year + ',' + char(39) + ',' + char(39) + ')'); 但这没用。这是我在这个网站上找到的唯一两个解决方案。有什么帮助吗 这是一个简化的查询,用于澄清您的所有问题: declare @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 , ',')

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

只需键入两次单引号:

select 'that''s it'

好的。。。您要获取此字符串:

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
来处理类似的内容,因为您可以使用参数化查询。

一句忠告。测试动态脚本时,首先只显示它,而不是执行它。这样,您将能够看到它与
EXEC
语句所看到的完全相同

现在来谈谈这个问题。您应该记住,您不是将变量传递给
SplitValues
,而是将变量的值连接到脚本中。由于该值是
varchar
,因此应该用引号将其连接起来。没有他们是唯一真正的问题

在这两种情况下,第二个参数逗号周围的引号都被正确转义。因此,只需使用以下任一方法在第一个参数周围添加引号:

  • 重复引号:

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')';
    SELECT @sql;
    
  • 使用字符(39):

显然,第一种方法更紧凑,但正如我所说的,这两种方法都很好地工作,这清楚地表明了这一点

然而,请注意,如果你原谅这个双关语,那么首先你可以很容易地避开这个问题。您可以使用允许您使用参数的
EXEC sp_executesql
,而不是
EXEC()
。下面是使用
sp\u 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需要正确替换值,而不是您。

这是我尝试的第一件事,正如您在我发布的解决方案中所看到的那样。不完全如此。“+char(39)+给你三个引号,而你需要四个。让我们尝试一下整个语句:exec('SELECT*fromsplitvalues('''+@year+''','''''','');为什么需要在这里使用EXEC?这是因为我现在处理的查询非常复杂,无法在这里发布。这只是我想做的事情的一瞥。可能重复。对不起,我不确定我是否理解。您在这里观察到的问题是什么?我想指出您的初始语句中的讽刺之处,即您应该打印命令,而不是执行命令进行验证,但是sp_executesql不允许您在不执行命令的情况下打印语句。如果有办法,也许你应该示范一下。我猜打印出语句的实用性有限,因为它比其他选项更可读。如果动态查询不包含任何名称参数化(在本例中没有),则不需要将许多部分粘在一起构建它。因此,是的,使用变量存储查询只是在执行之前/而不是在执行之前打印它似乎没有什么价值。
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
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;
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