当前位置: 代码迷 >> Sql Server >> 消息 102,级别 15,状态 1,第 5 行 ')' 附近有语法异常
  详细解决方案

消息 102,级别 15,状态 1,第 5 行 ')' 附近有语法异常

热度:512   发布时间:2016-04-24 20:04:51.0
消息 102,级别 15,状态 1,第 5 行 ')' 附近有语法错误。

create proc usp_GetAllLogsSelect_Pages
@Category int,
@Visible int,
@Uname varchar(50),
@PageSize int,
@PageIndex int
AS
declare @x int,@y int
set @x=(@PageIndex-1)*@PageSize+1
set @y=(@PageIndex)*@PageSize

exec ('select* from(
      select ROW_NUMBER() over(order by ReleaseTime desc) as Rownum,
      LId,LogName,Abstract,CommentNo,ReadNo,UName,Category,ReleaseTime
      from Logs
      where Category='+@Category+' and Visible='+@Visible+' and Uname like '+@Uname+')
      as log
      where Rownum between '+@x+' and ' +@y) 


死活都是这个错误消息 102,级别 15,状态 1,第 5 行
')' 附近有语法错误。
没办法了来提问
SQL

------解决方案--------------------
alter proc usp_GetAllLogsSelect_Pages 
AS
begin
declare @Category int,
        @Visible int,
@Uname varchar(50),
@PageSize int,
@PageIndex int,
@x int,
@y int
set @x=(@PageIndex-1)*@PageSize+1
set @y=(@PageIndex)*@PageSize

exec ('select* from(
      select ROW_NUMBER() over(order by ReleaseTime desc) as Rownum,
      LId,LogName,Abstract,CommentNo,ReadNo,UName,Category,ReleaseTime
      from Logs
      where Category='+@Category+' and Visible='+@Visible+' and Uname like '+@Uname+')
      as log
      where Rownum between '+@x+' and ' +@y) 
end

你要 把参数传递好
------解决方案--------------------
  where Category='+@Category+' and Visible='+@Visible+' and Uname like '+@Uname+')

改成

  where Category='+@Category+' and Visible='+@Visible+' and Uname like '''+@Uname+''')

就可以啦 你试试吧
------解决方案--------------------
最简单的方法是把你的exec改成print,然后调试,通常都是单引号和双引号的问题和类型转换的问题而已
------解决方案--------------------
引用:
Quote: 引用:

  where Category='+@Category+' and Visible='+@Visible+' and Uname like '+@Uname+')

改成

  where Category='+@Category+' and Visible='+@Visible+' and Uname like '''+@Uname+''')

就可以啦 你试试吧

哇塞,真的成功了,这是啥原理啊?!!!!


主要的问题在于@uname变量时varchar类型的,在动态拼接语句时,如果是要拼接字符串的值,你要生成如下的语句:
……and Uname like '字符串值'

但你上面的语句拼接的时候少了括住@uname值的引号:
' and Uname like '+ @Uname 

那么为了加上引号,拼接的时候必须要写成这样,要把引号写两次:
' Uname like '''+ @Uname + ''''


------解决方案--------------------
create proc usp_GetAllLogsSelect_Pages后面用括号把参数括起来就可以了啊
create proc usp_GetAllLogsSelect_Pages
(
@Category int,
@Visible int,
@Uname varchar(50),
@PageSize int,
@PageIndex int
)
AS
declare @x int,@y int
set @x=(@PageIndex-1)*@PageSize+1
set @y=(@PageIndex)*@PageSize

exec ('select* from(
      select ROW_NUMBER() over(order by ReleaseTime desc) as Rownum,
      LId,LogName,Abstract,CommentNo,ReadNo,UName,Category,ReleaseTime
      from Logs
      where Category='+@Category+' and Visible='+@Visible+' and Uname like '+@Uname+')
      as log
      where Rownum between '+@x+' and ' +@y) 
  相关解决方案