如何实现sql里存储过程 的 多条件模糊查询

sinat_30291429 2015-09-10 05:25:39
ALTER PROCEDURE [dbo].[bha_pad10000] -- 存储过程名
@createuser nchar(20) = null, --设置输入参数
@primarytag1 datetime ,
@primarytag2 datetime ,
@prcode char(12)= null,
@orderno varchar(12)= null
@part varchar(30)= null,
@mono char(12)= null,
@prseq char(4)= null

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT distinct 创建人=createuser, --创建者
制程代号=prcode, --制程代号
料号=part, --料单
订单号=orderno, --订单号
制令号=mono, --制令号
制令序号=moseq,
扫描时间=primarytag,
制程序号=prseq, --制程序号
创建时间=createdate, --创建时间
检测码=checkyn,
料号编号=partcode,
产品编码=productcode,
内部编号=innercode,
外部编号=outtercode

from bha_pda10000 where
createuser like '%['+@createuser+']%' --创建者
and (createdate between @primarytag1 and @primarytag2) -- 时间
and prcode like '%['+@prcode+']%' --制程代号
and orderno like '%['+@orderno+']%' --订单号
and part like '%['+@part+']%' --料号
and mono like '%['+@mono+']%' --制令号
and prseq like '%['+@prseq+']%' --制程序号


END


刚学存储过程, 不太会写。 我要实现的功能是一个多条件模糊查询,发现写出来总是有问题。我目的是如果所有编辑框为空查询所有数据,哪个编辑框有数据就查询哪个字段,这样的功能。我写这个存储过程如果为空的时候老是查不到数据。 哪位大神帮我改改
...全文
510 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2015-09-15
  • 打赏
  • 举报
回复
你要用动态sql set @sql='select '+@字段+' from tb where '+条件 exec(@sql);
sinat_30291429 2015-09-15
  • 打赏
  • 举报
回复
引用 7楼gw6328 的回复:
你要用动态sql set @sql='select '+@字段+' from tb where '+条件 exec(@sql);
嗯。我后来就学了这种方法。这个字符串的存储过程会不会影响效率?还是一样的呢?不过还是要感谢各位
jfjava 2015-09-14
  • 打赏
  • 举报
回复
alter PROCEDURE [dbo].[bha_pad10000] -- 存储过程名 @createuser nchar(20) = null, --设置输入参数 @primarytag1 datetime , @primarytag2 datetime , @prcode char(12)= null, @orderno varchar(12)= null, ---之前少了个逗号 @part varchar(30)= null, @mono char(12)= null, @prseq char(4)= null AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; declare @sql varchar(1000) -- Insert statements for procedure here set @sql='SELECT distinct 创建人=createuser, --创建者 制程代号=prcode, --制程代号 料号=part, --料单 订单号=orderno, --订单号 制令号=mono, --制令号 制令序号=moseq, 扫描时间=primarytag, 制程序号=prseq, --制程序号 创建时间=createdate, --创建时间 检测码=checkyn, 料号编号=partcode, 产品编码=productcode, 内部编号=innercode, 外部编号=outtercode from bha_pda10000 where createuser like %['+@createuser+']% --创建者' +'and (createdate between ' + @primarytag1 +'and '+@primarytag2+') -- 时间' +'and prcode like %['+@prcode+']% --制程代号' +'and orderno like %['+@orderno+']% --订单号' +'and part like %['+@part+']% --料号' +'and mono like %['+@mono+']% --制令号' +'and prseq like %['+@prseq+']% --制程序号' exec(@sql) END 试下
等不到来世 2015-09-14
  • 打赏
  • 举报
回复

createuser like '%['+@createuser+']%' 
改为:
(createuser is null or createuser like '%['+@createuser+']%' )

其他条件类似。
十林 2015-09-14
  • 打赏
  • 举报
回复

alter PROCEDURE [dbo].[bha_pad10000]      -- 存储过程名
@createuser nchar(20) = null,             --设置输入参数
@primarytag1 datetime  = null,
@primarytag2 datetime  = null,
@prcode char(12)= null,
@orderno varchar(12)= null,
@part varchar(30)= null,
@mono char(12)= null,
@prseq char(4)= null

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
/*test script
 [dbo].[bha_pad10000]
  [dbo].[bha_pad10000] 'erere'
*/
SET NOCOUNT ON;

Declare @strsql nvarchar(max) 
set @strsql=N'SELECT distinct 创建人=createuser,  --创建者
制程代号=prcode,                   --制程代号
料号=part,                        --料单
订单号=orderno,                   --订单号
制令号=mono,                       --制令号
制令序号=moseq,
扫描时间=primarytag,
制程序号=prseq,                 --制程序号
创建时间=createdate,        --创建时间
检测码=checkyn,
料号编号=partcode,
产品编码=productcode,
内部编号=innercode,
外部编号=outtercode

from bha_pda10000 where
1=1 '+coalesce(' and createuser like ''%['+rtrim(@createuser)+']%''','')
--注意日期@primarytag1,@primarytag2格式
+coalesce(' and (createdate between '+cast(@primarytag1 as varchar(30))+' and '+cast(@primarytag1 as varchar(30))+') ','')
+coalesce(' and prcode like ''%['+rtrim(@prcode)+']%''','')
+coalesce(' and orderno like ''%['+rtrim(@orderno)+']%''','')
+coalesce(' and part like ''%['+rtrim(@part)+']%''','')
+coalesce(' and mono like ''%['+rtrim(@mono)+']%''','')
+coalesce(' and prseq like ''%['+rtrim(@prseq)+']%''','')
print @strsql

exec(@strsql)

End
试试这个吧, 注意一下楼上提到的[ ]得问题,除非你得数据都是用[] 开头和结尾的,不然代码中的[] 要去除。
qq_17482963 2015-09-10
  • 打赏
  • 举报
回复
你的表里面的数据都包含[]这个方括号吗,如果你传的参数为空字符串的话就会是like '%[]%'这样了
sinat_30291429 2015-09-10
  • 打赏
  • 举报
回复
求大神啊。T.T
giftzheng 2015-09-10
  • 打赏
  • 举报
回复
like 的可以直接传'' 你问题出现在 = 与 and (createdate between @primarytag1 and @primarytag2) and (createdate between @primarytag1 and @primarytag2) 换成 and (createdate >= @primarytag1 or @primarytag1 is null) and (createdate <= @primarytag2 or @primarytag2 is null) 这样 @primarytag1 @primarytag2就可以直接传null 如果是=自己类推

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧