当前位置: 代码迷 >> Sql Server >> 怎么实现sql里存储过程 的 多条件模糊查询
  详细解决方案

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

热度:51   发布时间:2016-04-24 08:54:46.0
如何实现sql里存储过程 的 多条件模糊查询
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
 

刚学存储过程, 不太会写。 我要实现的功能是一个多条件模糊查询,发现写出来总是有问题。我目的是如果所有编辑框为空查询所有数据,哪个编辑框有数据就查询哪个字段,这样的功能。我写这个存储过程如果为空的时候老是查不到数据。 哪位大神帮我改改
------解决思路----------------------

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


试试这个吧, 注意一下楼上提到的[ ]得问题,除非你得数据都是用[] 开头和结尾的,不然代码中的[] 要去除。

------解决思路----------------------
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


试下
------解决思路----------------------
你要用动态sql

set @sql='select  '+@字段+' from tb where '+条件
exec(@sql);
  相关解决方案