sql中字符串内的单引号

sql中字符串内的单引号,sql,sql-server-2008,tsql,sql-server-2012,sql-like,Sql,Sql Server 2008,Tsql,Sql Server 2012,Sql Like,我有以下SQL查询用于搜索目的 有一个@st变量,它被分配了一个SQL查询,最后我将执行查询。问题是@st变量被分配了一个字符串(即查询),并且在字符串中有LIKE表达式,例如: address like '%edmon%' 因此,它变成: set @st='select * from infoone where address like '%edmon%'' 它导致了一个错误: edmon附近的语法不正确 完整的查询如下: declare @v int; declare @st varch

我有以下SQL查询用于搜索目的

有一个
@st
变量,它被分配了一个SQL查询,最后我将执行查询。问题是
@st
变量被分配了一个字符串(即查询),并且在字符串中有
LIKE
表达式,例如:

address like '%edmon%'
因此,它变成:

set @st='select * from infoone where address like '%edmon%''
它导致了一个错误:

edmon附近的语法不正确

完整的查询如下:

declare @v int;
declare @st varchar(1000);

set @st = 'select PLACEID, LEFT(CONVERT(NVARCHAR(1000), description), 500) as
des1, LOCATIONCITY, ADDRESS, DateT, RENT from infoone where '; 

Select @v = count(address) 
from infoone  
where ((address like '%main%') OR (address like '%main street%') 
       OR (address like '%main street edmonton%'));

if @v>0 
begin 
    set @st = @st + '(address like '%main%') OR 
                     (address like '%main street%') OR 
                     (address like '%main street edmonton%')' + 
                    'and ('; 
end 
else begin
    execute(@st)
请让我知道我做错了什么以及如何解决它


谢谢

要获取字符串的单引号,请使用
'


要获取字符串上的单引号,请使用
'


Gordon Linoff已经向您解释了单引号的错误所在”,但您的声明也存在一些其他问题。做你想做的事情的更好的方法是这样的

declare @st nvarchar(MAX);

set @st=N' select PLACEID
                ,CONVERT(NVARCHAR(500),[description]) as des1
                ,LOCATIONCITY
                ,[ADDRESS]
                ,DateT
                ,RENT 
         from infoone  where 1 = 1 '; 

IF EXISTS (Select * from infoone  
                where(([ADDRESS] like '%main%') 
                   OR ([ADDRESS] like '%main street%') 
                   OR ([ADDRESS] like '%main street edmonton%')))
 begin 
   set @st = @st+ N' AND (
                       ([ADDRESS] like ''%main%'') 
                       OR
                       ([ADDRESS] like ''%main street%'') 
                       OR
                       ([ADDRESS] like ''%main street edmonton%'')
                      )'; 
 end 
else 
  begin
    set @st = @st+ N' AND  (Some Other Condition) )'
  end

EXECUTE sp_executesql @st

Gordon Linoff已经向您解释了单引号的错误所在”,但您的声明也存在一些其他问题。做你想做的事情的更好的方法是这样的

declare @st nvarchar(MAX);

set @st=N' select PLACEID
                ,CONVERT(NVARCHAR(500),[description]) as des1
                ,LOCATIONCITY
                ,[ADDRESS]
                ,DateT
                ,RENT 
         from infoone  where 1 = 1 '; 

IF EXISTS (Select * from infoone  
                where(([ADDRESS] like '%main%') 
                   OR ([ADDRESS] like '%main street%') 
                   OR ([ADDRESS] like '%main street edmonton%')))
 begin 
   set @st = @st+ N' AND (
                       ([ADDRESS] like ''%main%'') 
                       OR
                       ([ADDRESS] like ''%main street%'') 
                       OR
                       ([ADDRESS] like ''%main street edmonton%'')
                      )'; 
 end 
else 
  begin
    set @st = @st+ N' AND  (Some Other Condition) )'
  end

EXECUTE sp_executesql @st

我同意“存在”比“计数”好,但我并不觉得这一步是必要的。事实上,这似乎有点令人困惑——如果表中有一个包含main的地址,那么添加这个where子句并将其限制在这些行中,否则返回所有内容?此外,三个OR是冗余的。如果有任何东西与%main%匹配,那么它们也将与%main street%和%main street edmonton%匹配。我同意EXISTS比COUNT好,但我并不觉得这一步是必要的。事实上,这似乎有点令人困惑——如果表中有一个包含main的地址,那么添加这个where子句并将其限制在这些行中,否则返回所有内容?此外,三个OR是冗余的。如果任何东西匹配%main%,那么它们也将匹配%main street%和%main street edmonton%。任何匹配
的东西,比如“%main%”
也将匹配
比如“%main street%”
比如“%main street edmonton%”
-那么为什么不直接说
比如“%main%”呢,获得一个计数是一个糟糕的想法——这意味着SQL Server必须对所有匹配的行进行计数。因为您只关心是否至少有一行,所以use存在于M.Ali的答案中。任何匹配
的东西,如“%main%”
也将匹配
如“%main street%”
如“%main street edmonton%”
-那么为什么不直接说
如“%main%”
,获得一个计数是一个糟糕的想法——这意味着SQL Server必须对所有匹配的行进行计数。因为您只关心是否至少有一行,所以使用存在于M.Ali的答案中。