建立如下存储过程,报两个错误:1.case' 附近有语法错误;2.@areaStr' 附近有语法错误.
CREATE PROCEDURE invite
@text Nvarchar(30) = null, 
@type int=0,
@area Nvarchar(6)=null
AS
declare @sqlStr Nvarchar(500)
         declare @typeStr Nvarchar(50)
declare @areaStr Nvarchar(50)

case 
when @type=0 then @typeStr='contains(title,file)'
when @type=1 then @typeStr='contains(word,file)'
when @type=2 then @typeStr='contains(text,file)'
end
if(@area!='所有')
@areaStr=' and nal=@area'
else
@areaStr=''

@sqlStr='select * from file where '+@typeStr+@areaStr+' and checked=1' EXECUTE invite
GO

解决方案 »

  1.   

    CREATE PROCEDURE invite
    @text Nvarchar(30) = null, 
    @type int=0,
    @area Nvarchar(6)=null
    AS
    declare @sqlStr Nvarchar(500)
             declare @typeStr Nvarchar(50)
    declare @areaStr Nvarchar(50)

    select 
    @typeStr=case @type
    when 0 then 'contains(title,file)'
    when 1 then 'contains(word,file)'
    when 2 then 'contains(text,file)'
    else ''
    end
    if(@area!='所有')
    select  @areaStr=' and nal=@area'
    else
    select @areaStr=''

    select @sqlStr='select * from file where '+@typeStr+@areaStr+' and checked=1' EXECUTE invite
    GO
      

  2.   

    感谢8LY8Apollo(阿波罗)!
    敢问此语法规则,请再伸援手!
      

  3.   

    if(@area!='所有')??
    SQL中的不等于是"<>"
      

  4.   

    心里一阵寒意...建议楼主用SQL的联机帮助文件搞清楚 case 以及变量赋值的用法再来问...帮助文件里有例子的,简明易懂另:变量赋值可以用 select 也可以用set
      

  5.   

    变量赋值必须加set或select
    if(@area <> '所有')
    set @areaStr=' and nal=@area'
    else
    set @areaStr=''

    set @sqlStr='select * from file where '+@typeStr+@areaStr+' and checked=1'
      

  6.   

    心里一阵寒意...建议楼主用SQL的联机帮助文件搞清楚 case 以及变量赋值的用法再来问...看到liuqinglq(白菜)兄的回贴,感激之余,我真是惭愧得无地自容。实际上我看了很久的联机帮助文件,但是因为功力不足,根本就看花了眼,实在没有找到存储过程临时变量等内容,烦请指点。
      

  7.   

    可否在语句中直接加Return来获得返回值?
    set @sqlStr='Return(select Count(*) from file where '+@typeStr+@areaStr+' and checked=1)'
      

  8.   

    可否在语句中直接加Return来获得返回值?CREATE PROCEDURE invite
    @text Nvarchar(30) = null, 
    @type int=0,
    @area Nvarchar(6)=null
    AS
    declare @sqlStr Nvarchar(500)
             declare @typeStr Nvarchar(50)
    declare @areaStr Nvarchar(50)
    select 
    @typeStr=case @type
    when 0 then 'contains(title,file)'
    when 1 then 'contains(word,file)'
    when 2 then 'contains(text,file)'
    else ''
    end
    if(@area!='所有')
    select  @areaStr=' and nal=@area'
    else
    select @areaStr=''
    select @sqlStr='select * from file where '+@typeStr+@areaStr+' and checked=1'
    EXECUTE invite
    GO
      

  9.   

    楼主你到底有没有把我的话听进去...-_-RETURN是怎么用,一查联机帮助不就知道了
      

  10.   

    心里一阵寒意...建议楼主用SQL的联机帮助文件搞清楚 case 以及变量赋值的用法再来问...看到liuqinglq(白菜)兄的回贴,感激之余,我真是惭愧得无地自容。实际上我看了很久的联机帮助文件,但是因为功力不足,根本就看花了眼,实在没有找到存储过程临时变量等内容,烦请指点。
    ---------------------------------------------------------------------------------------显然已只有查CASE才能看到case的用法。查变量的地方都能得到变量赋值的简单例子。抠字眼,学究气,钻进去出不来,简单的问题学不进去,只想着匹配一两个先入为主的字词然后照抄,不是好的学习方法。好的学习方法是“理解”!
      

  11.   

    对于存储过程甚至于SQLSERVER只是一个初学者,入手只学C#,后学ASP.NET。所以凡事都处在摸索阶段,问题当然令人失望,不过相信不远的将来,我也会成为初学者的入门指导。
    以上的问题,我看了一大堆的理论,“理解”其原理,但是细节部分没法实现。如果把这些问题放在应用程序层面来解决会很容易,直接传参数进来就是。不过我还是想完全用存储过程来实现。
    哈哈,学而时习之,不亦乐乎!
    又改了改,还是出错。
    CREATE PROCEDURE invite
    @text Nvarchar(30) = null, 
    @type int=0,
    @area Nvarchar(6)=null
    AS
    declare @sqlStr Nvarchar(500)
             declare @typeStr Nvarchar(50)
    declare @areaStr Nvarchar(50)
    select 
    @typeStr=case @type
    when 0 then 'contains(title,@text)'
    when 1 then 'contains(word,@text)'
    when 2 then 'contains(text,@text)'
    else ''
    end
    if(@area!='所有')
    select  @areaStr=' and nal=@area'
    else
    select @areaStr=''
    select @sqlStr=select Count(*) from file where '+@typeStr+@areaStr
             
    EXECUTE invite
    GO
      

  12.   

    select  @areaStr=' and nal=@area'这是什么道理?出错也是有道理的吧?不然大家都累。
      

  13.   

    CREATE PROCEDURE invite
    @text Nvarchar(30) = null,   --查询关键词
    @type int=0,                 --选择类别
    @area Nvarchar(6)=null       --选择地区
    AS
    declare @sqlStr Nvarchar(500)  --构造查询字符串
             declare @typeStr Nvarchar(50)  --转换成查询字符串的一部分(在where部分)
    declare @areaStr Nvarchar(50)  
    select 
    @typeStr=case @type
    when 0 then 'contains(title,@text)'
    when 1 then 'contains(word,@text)'
    when 2 then 'contains(text,@text)'
    else ''
    end
    if(@area!='所有')
    select  @areaStr=' and nal=@area' --转换成查询字符串的一部分(在where部分),nal是一个表示地区的字段名
    else
    select @areaStr=''
    select @sqlStr=select Count(*) from file where '+@typeStr+@areaStr   --返回记录总数
             
    EXECUTE invite
    GO
      

  14.   

    存储过程可以创建了,但是运行时发生如下错误:
    将 nvarchar 值 'select Count(*) from files where contains(title,@text) and DATEDIFF(mm,updatetime,GetDate())<=6 and nal=@area' 转换为数据类型为 int 的列时发生语法错误。
      

  15.   

    存储过程可以创建了,但是运行时发生如下错误:  
    将  nvarchar  值  'select  Count(*)  from  files  where  contains(title,@text)  and  nal=@area'  转换为数据类型为  int  的列时发生语法错误。
      

  16.   

    CREATE PROCEDURE invite
    @text Nvarchar(30) = null, 
    @type int=0,
    @area Nvarchar(6)=null
    AS
    declare @sqlStr Nvarchar(500)
             declare @typeStr Nvarchar(50)
    declare @areaStr Nvarchar(50) set @typeStr=''
    if @text is not null and @text <> ''
    set @typeStr=case @type
    when 0 then 'contains(title,'''+ convert(varchar,@text) + ''')'
    when 1 then 'contains(word,'''+ convert(varchar,@text) + ''')'
    when 2 then 'contains(text,'''+ convert(varchar,@text) + ''')'
    else ''
    endif(@area<>'所有')
    select  @areaStr=' and nal=@area'
    else
    select @areaStr=''
    select @sqlStr='select Count(*) from file where '+@typeStr+@areaStrEXECUTE (@sqlStr)
    GO
      

  17.   

    select  @areaStr=' and nal=@area'    ???????
    你到底要给它赋值什么啊?  给@areaStr  一个字符串? ' and nal=@area'   
    你的意思是要变量 @area 值的值吧?   
    select  @areaStr=' and nal='+ "'"+convert(varchar,@area)+"'"  
    是这个意思吗?
      

  18.   

    CREATE PROCEDURE invite
             @text Nvarchar(30) = null,   --查询关键词
             @type int=0,                 --选择类别
             @date int=0,                 --选择时间
             @area Nvarchar(6)=null       --选择地区
    AS
             declare @sqlStr Nvarchar(500)  --构造查询字符串
             declare @typeStr Nvarchar(50)  --转换成查询字符串的一部分(在where部分)
             declare @dateStr Nvarchar(50)
             declare @areaStr Nvarchar(50)  
    select 
             @typeStr=case @type
                           when 0 then 'contains(title,'''+@text+''')'
                           when 1 then 'contains(word,'''+@text+''')'
                           when 2 then 'contains(text,'''+@text+''')'
                      else ''
                      end
    set  @dateStr=case @date
    when 0 then ''
    when 1 then ' and DATEDIFF(dd,updatetime,GetDate())<=7'
    when 2 then ' and DATEDIFF(mm,updatetime,GetDate())<=1'
    when 3 then ' and DATEDIFF(mm,updatetime,GetDate())<=3'
    when 4 then ' and DATEDIFF(mm,updatetime,GetDate())<=6'
    else ''
     end
             if(@area!='所有')
                 select @areaStr=' and nal='''+@area+'' --转换成查询字符串的一部分(在where部分),nal是一个表示地区的字段名
             else
                 select @areaStr=''
            select @sqlStr=select Count(*) from file where '+@typeStr+@areaStr   --返回记录总数
             
    EXECUTE invite
    GO
      

  19.   

    调试以后,发生如下错误:
    将 nvarchar 值 'select Count(*) from files where contains(title,'苹果') and DATEDIFF(mm,updatetime,GetDate())<=6 and region1='北京' 转换为数据类型为 int 的列时发生语法错误。
    下面这一句也不对,结果是 and region1='北京
    后面少一个单引号 
    select @areaStr=' and nal='''+@area+''
      

  20.   

    CREATE PROCEDURE invite
             @text Nvarchar(30) = null,   --查询关键词
             @type int=0,                 --选择类别
             @date int=0,                 --选择时间
             @area Nvarchar(6)=null       --选择地区
    AS
             declare @sqlStr Nvarchar(500)  --构造查询字符串
             declare @typeStr Nvarchar(50)  --转换成查询字符串的一部分(在where部分)
             declare @dateStr Nvarchar(50)
             declare @areaStr Nvarchar(50)  
    select 
             @typeStr=case @type
                           when 0 then 'contains(title,'''+@text+''')'
                           when 1 then 'contains(word,'''+@text+''')'
                           when 2 then 'contains(text,'''+@text+''')'
                      else ''
                      end
    set  @dateStr=case @date
    when 0 then ''
    when 1 then ' and DATEDIFF(dd,updatetime,GetDate())<=7'
    when 2 then ' and DATEDIFF(mm,updatetime,GetDate())<=1'
    when 3 then ' and DATEDIFF(mm,updatetime,GetDate())<=3'
    when 4 then ' and DATEDIFF(mm,updatetime,GetDate())<=6'
    else ''
     end
             if(@area!='所有')
                 select @areaStr=' and nal like'''+@area+'''' --转换成查询字符串的一部分(在where部分),nal是一个表示地区的字段名
             else
                 select @areaStr=''
            select @sqlStr=select Count(*) from file where '+@typeStr+@areaStr   --返回记录总数
             
    EXECUTE invite
    GO
      

  21.   

    超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)
    应该用EXECUTE (@sqlStr)而不能用 EXECUTE invite!
        问题基本解决啦,真的非常感谢大家,尤其是8LY8Apollo(阿波罗) 和 Truly(NULL)兄弟。 
        非常痛恨Transact-SQL语言,微软应该将自己的编程语言统一起来,搞成一个真正的“西方失败”,才有可能“千秋万代,一统江湖“。现在刀是刀法,剑是剑法,刀剑不能通用,学了微软的手艺出来混还得十八般兵器都背着,先累个来死,还怎么砍人?
        诸位兄弟,如果谁将来武功天下第一了,千万牢记千秋万代,一统江湖哇! 
      

  22.   

    if(@area!='所有')
                 select @areaStr=' and nal like'''+@area+'''' 
             else
                 select @areaStr=''
            select @sqlStr=select Count(*) from file where '+@typeStr+@areaStr  对字符串赋值不正确
           if(@area!='所有')
                 select @areaStr=" and nal like"  +  "'"  +  @area  +"'" 
             else
                 select @areaStr=''
            select @sqlStr= 'select Count(*) from file where '+@typeStr+@areaStr