免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5001 | 回复: 7
打印 上一主题 下一主题

有6个查询条件,其中有4个可以不输入,请问存储过程怎么写? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-19 19:46 |只看该作者 |正序浏览
查询出来的字段不是同一个表中的字段。我没有写过存储过程,瞎写了一个,请大虾帮我改一下。
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[sp_Member_GetMemberProduct]
@infotype int,        --信息类型:1:供应 2:求购,不能为空
@protypechilid int, --子类型编号,不能为空
@comproid int,        --省份id
@comcityid int,        --市id
@keyWords varchar(500),        --搜索关键字
@userlevel int ,        --查看鼎诚商会员
@onlineUser int,        --仅查看在线会员
@Area int,        --按省份筛选
@pagesize int,        --显示的数据条数
@pageindex int        --当前页面
AS
declare @strSql varchar(5000)        --输入的sql
declare @strOrderby varchar(50)  --order by
set @strSql=\' select mp.title,mp.pubtime,mp.descript,udi.comname,ui.uid,ui.uname,(select count(*) from certificate where uid=ui.uid and certypename=\'\'xx\'\') as a,(select count(*) from certificate where uid=ui.uid and certypename=\'yy\'\') as b,ui.ulevel,mp.mpnum,mi.limage,p.ProName,c.cityname from userinfo ui,userdinfo udi,memberproduct mp,mimages mi,provinceList p,citylist c where ui.uid = mp.uid and ui.uid = udi.uid and mp.mpnum = mi.mpnum and mp.infostate = 2 and mp.isshow = 1 and udi.ComProID=p.ComProID and udi.comcityid= c.comcityid and ui.ulevel < 6 \'
set @strOrderby=\'order by ui.ULevel DESC, mp.PubTime DESC\'

if(@infotype <> \'\')--关键字不为空时
begin
set @strSql = @strSql + \' and mp.infotype = \' + @infotype
END

if(@protypechilid <> \'\')--关键字不为空时
begin
set @strSql = @strSql + \' and mp.protypechilid = \' + @protypechilid
END

if(@comproid <> \'\')--关键字不为空时
begin
set @strSql = @strSql + \' and udi.comproid = \' + @comproid
END

if(@comcityid <> \'\')--关键字不为空时
begin
set @strSql = @strSql + \' and udi.comcityid = \' + @comcityid
END

if(@userlevel <> \'\')--关键字不为空时
begin
set @strSql = @strSql + \' and ui.ulevel = \' + @userlevel
END

--if(@onlineUser <> \'\')--关键字不为空时
--begin
--@strSql = @strSql + \'\'
--END

if(@Area <> \'\')--关键字不为空时
begin
set @strSql = @strSql + \' and udi.ComProID = \' + @Area
END

if(@keyWords <> \'\')--关键字不为空时
begin
set @strSql = @strSql + \' and ( mp.title like \'\'%\' + @keyWords + \'%\'\'
                                                         or mp.Descript like \'\'%\' + @keyWords + \'%\'\'
                                                         or mp.ProName like \'\'%\'+@keyWords+\'%\'\'
                                                         or mp.ProArea like \'\'%\'+@keyWords+\'%\'\'
                                                         or mp.ProModel like \'\'%\'+@keyWords+\'%\'\'
                                                         or udi.ComName like \'\'%\'+@keyWords+\'%\'\'
                                                         or udi.Office like \'\'%\'+@keyWords+\'%\'\'
                                                         or udi.ComAddress like \'\'%\'+@keyWords+\'%\'\'
                                                         or udi.RegAddress like \'\'%\'+@keyWords+\'%\'\'
                                                         or udi.ComIntr like \'\'%\'+@keyWords+\'%\'\'  )  \'
END

set @strSql = @strSql + @strOrderby

论坛徽章:
0
8 [报告]
发表于 2009-11-01 16:54 |只看该作者
把输入参数的默认数值设置为NULL,语句里用动态SQL拼接就可以。

论坛徽章:
0
7 [报告]
发表于 2009-10-31 11:23 |只看该作者
alter proc MutchSearch
@selement varchar(20)=\'金\',
@nstroke varchar(20)=\'2\',
@sradicalname varchar(20)=null,
@spinyinfull varchar(20)=null,
@namestroke varchar(20)=\'2\',
@sqlstr int output,
@sqlresult varchar(100)
as
set @sqlresult=\'select *from Font_FontInfo where\'
while(@selement!=null)
begin
   @sqlresult+=\'@selement=sElement\'
   if(@@rowcount<>0)
   return
   else
   set @sqlstr=0
   return @sqlstr
end
while(@nstroke!=null)
begin
   --select * from Font_FontInfo where @nstroke=nStroke
   @sqlresult+=\'@nstroke=nStroke\'
   if(@@rowcount<>0)
   return
   else
   set @sqlstr=0
   return @sqlstr
end
while(@sradicalname!=null)
begin
   select * from Font_FontInfo where @sradicalname=sRadicalname
   if(@@rowcount<>0)
   return
   else
   set @sqlstr=0
   return @sqlstr
end
while(@spinyinfull!=null)
begin
   select * from Font_FontInfo where @spinyinfull=sRadicalname
   if(@@rowcount<>0)
   return
   else
   set @sqlstr=0
   return @sqlstr
end
while(@namestroke!=null)
begin
   select * from Font_FontInfo where @namestroke=nNameStroke
   if(@@rowcount<>0)
   return
   else
   set @sqlstr=0
   return @sqlstr
end
while(@selement!=null and @nstroke!=null and @sradicalname!=null and @spinyinfull!=null and @namestroke!=null)
begin
   select *from Font_FontInfo where @selement=sElement and @nstroke=nStroke and @sradicalname=sRadicalName and @spinyinfull=sPinyinFull and @namestroke=nNameStroke
   if @@rowcount<>0
   return
   else
   set @sqlstr=0
   return @sqlstr
end
go

declare @t_sqlstr int
exec MutchSearch
@sqlstr=@t_sqlstr output
select \'code\'=@t_sqlstr
参考下吧,我也碰到和你类似的问题!!希望来个高手解决下!!

论坛徽章:
0
6 [报告]
发表于 2007-11-23 13:49 |只看该作者
好像可以设置当关键字为\'\'时,默认值为一个定义值.

论坛徽章:
0
5 [报告]
发表于 2007-10-20 20:29 |只看该作者
lz自己写得看上去也行

论坛徽章:
0
4 [报告]
发表于 2007-10-20 13:40 |只看该作者
存储过程参数可以带默认值。这个我知道,我就是像这样:如果(@infotype 这个参数根本没有输入的话,我的where条件中,就不加@strSql = @strSql + \' and mp.infotype = \' + @infotype这个条件了。
if(@infotype <> \'\')--关键字不为空时
begin
set @strSql = @strSql + \' and mp.infotype = \' + @infotype
END

论坛徽章:
0
3 [报告]
发表于 2007-10-20 12:00 |只看该作者
存储过程参数可以带默认值。

不输入得条件可以用  1=1 等代替

论坛徽章:
0
2 [报告]
发表于 2007-10-19 21:45 |只看该作者
......
@pageindex int  = 0

可以不输入的全部放到后面,设定预设值
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP