建立如下存储过程,报两个错误: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
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
解决方案 »
- GridView中的模板列添加一个checkbox运行后发现其它ID变成GridView1$ctl01$cbItem
- 关于图片加水印的一个小小疑惑,谢谢~。
- 角色与权限管理
- cookie 在服务器段和客户端编码解码问题,搞了好几天了
- 怎么样设置from的action属性?
- 怎么获得fileupload中文本框里的值?
- 未将对象引用设置到对象的实例!帮帮小弟吧!
- 我有一个框架页,如何在另一个框架页获一个框架得服务器控件的值?
- 快来看啊!刚出炉的求解大送分!!Datagrid事件的问题,不要错过好!!简单!分多!!
- TreeView在Asp.net的工具箱中为何无法显示?在线等待各位的支持。
- 〖求助〗如何把DataGrid中的数据更新到DataTable中???
- 菜鸟提问:关于查询页面的处理的问题!!!!!(主要是数据集的传递!)
@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
敢问此语法规则,请再伸援手!
SQL中的不等于是"<>"
if(@area <> '所有')
set @areaStr=' and nal=@area'
else
set @areaStr=''
set @sqlStr='select * from file where '+@typeStr+@areaStr+' and checked=1'
set @sqlStr='Return(select Count(*) from file where '+@typeStr+@areaStr+' and checked=1)'
@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
---------------------------------------------------------------------------------------显然已只有查CASE才能看到case的用法。查变量的地方都能得到变量赋值的简单例子。抠字眼,学究气,钻进去出不来,简单的问题学不进去,只想着匹配一两个先入为主的字词然后照抄,不是好的学习方法。好的学习方法是“理解”!
以上的问题,我看了一大堆的理论,“理解”其原理,但是细节部分没法实现。如果把这些问题放在应用程序层面来解决会很容易,直接传参数进来就是。不过我还是想完全用存储过程来实现。
哈哈,学而时习之,不亦乐乎!
又改了改,还是出错。
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
@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
将 nvarchar 值 'select Count(*) from files where contains(title,@text) and DATEDIFF(mm,updatetime,GetDate())<=6 and nal=@area' 转换为数据类型为 int 的列时发生语法错误。
将 nvarchar 值 'select Count(*) from files where contains(title,@text) and nal=@area' 转换为数据类型为 int 的列时发生语法错误。
@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
你到底要给它赋值什么啊? 给@areaStr 一个字符串? ' and nal=@area'
你的意思是要变量 @area 值的值吧?
select @areaStr=' and nal='+ "'"+convert(varchar,@area)+"'"
是这个意思吗?
@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
将 nvarchar 值 'select Count(*) from files where contains(title,'苹果') and DATEDIFF(mm,updatetime,GetDate())<=6 and region1='北京' 转换为数据类型为 int 的列时发生语法错误。
下面这一句也不对,结果是 and region1='北京
后面少一个单引号
select @areaStr=' and nal='''+@area+''
@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
应该用EXECUTE (@sqlStr)而不能用 EXECUTE invite!
问题基本解决啦,真的非常感谢大家,尤其是8LY8Apollo(阿波罗) 和 Truly(NULL)兄弟。
非常痛恨Transact-SQL语言,微软应该将自己的编程语言统一起来,搞成一个真正的“西方失败”,才有可能“千秋万代,一统江湖“。现在刀是刀法,剑是剑法,刀剑不能通用,学了微软的手艺出来混还得十八般兵器都背着,先累个来死,还怎么砍人?
诸位兄弟,如果谁将来武功天下第一了,千万牢记千秋万代,一统江湖哇!
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