sql 存储过程参数为空则不作为条件

/****** Object:  StoredProcedure [dbo].[GetCommonGroupByRegion]    Script Date: 03/23/2017 17:31:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER proc  [dbo].[GetCommonGroupByRegion]
@CarCategory  varchar(50)=null,---车型
@CreateTimeStart datetime=null,  --入会开始时间
@CreateTimeEnd datetime=null,    --入会结束时间
@AuthenticationTimeStart datetime=null,    --认证开始时间
@AuthenticationTimeEnd datetime=null,    --认证结束时间
@BuyTimeStart datetime=null,    --购车开始时间
@BuyTimeEnd datetime=null    --购车结束时间

as
begin

DECLARE @strPC VARCHAR(2000), @strAPP VARCHAR(2000), @strWX VARCHAR(2000), @strWAP VARCHAR(2000)
---------------------pc start
SET @strPC = ( SELECT DISTINCT STUFF(
    ( SELECT ‘,‘‘‘+ qudao+‘‘‘‘ FROM CreatedType WITH ( NOLOCK )
      WHERE   qtype = ‘pc‘ ORDER BY qudao
      FOR XML PATH(‘‘)), 1,4, ‘‘) AS jzhw
    FROM   CreatedType t)
set @strPC= left(@strPC,len(@strPC)-1)
-------------------------pc end***********
------------------------app start
SET @strAPP = ( SELECT DISTINCT STUFF(
    ( SELECT ‘,‘‘‘+ qudao+‘‘‘‘ FROM CreatedType WITH ( NOLOCK )
      WHERE   qtype = ‘app‘ ORDER BY qudao
      FOR XML PATH(‘‘)), 1,4, ‘‘) AS jzhw
    FROM   CreatedType t)
set @strAPP= left(@strAPP,len(@strAPP)-1)
------------------------- app end *******
------------------------wx start
SET @strWX = ( SELECT DISTINCT STUFF(
    ( SELECT ‘,‘‘‘+ qudao+‘‘‘‘ FROM CreatedType WITH ( NOLOCK )
      WHERE   qtype = ‘wx‘ ORDER BY qudao
      FOR XML PATH(‘‘)), 1,4, ‘‘) AS jzhw
    FROM   CreatedType t)
set @strWX= left(@strWX,len(@strWX)-1)
------------------------- wx end *******
------------------------wap start
SET @strWAP = ( SELECT DISTINCT STUFF(
    ( SELECT ‘,‘‘‘+ qudao+‘‘‘‘ FROM CreatedType WITH ( NOLOCK )
      WHERE   qtype = ‘wap‘ ORDER BY qudao
      FOR XML PATH(‘‘)), 1,4, ‘‘) AS jzhw
    FROM   CreatedType t)
set @strWAP= left(@strWAP,len(@strWAP)-1)
------------------------- wap end *******
 select
 c.CarCategory as ‘车型‘,
 d.Region as ‘区域‘,
 COUNT(case when a.CreatedPerson like ‘%D%‘ and  len(a.CreatedPerson)=5 then a.Id else null end ) as ‘经销商‘,
 COUNT(case when a.CreatedPerson in( @strPC)  then a.Id else null end ) as ‘网站‘,

 COUNT(case when a.CreatedPerson in(@strAPP) then a.Id else null end ) as ‘APP‘,

 COUNT(case when a.CreatedPerson in(@strWX) then a.Id else null end ) as ‘微信‘,

 COUNT(case when a.CreatedPerson in( @strWAP) then a.Id else null end ) as ‘wap‘
  from
   Membership  a
 left join IF_Customer b  on a.IdentityNumber=b.IdentityNumber
 left join IF_Car  c on b.CustId=c.CustId
 left join CS_CarDealerShip  d on c.DealerId=d.DealerId
 where
 a.IsDel=0  

 --case when @CreateTimeStart is not null then  and a.CreateTime>@CreateTimeStart else null end
 --and ( (@CreateTimeStart is not null and @CreateTimeStart!=‘‘) and (a.CreateTime>@CreateTimeStart) )
 --and ( (@CreateTimeEnd is not null and @CreateTimeEnd!=‘‘) and (a.CreateTime<[email protected]) )

 and (a.CreateTime>=@CreateTimeStart or @CreateTimeStart is null)
 and (a.CreateTime<=@CreateTimeEnd or @CreateTimeEnd is null) 

 --and ( (@AuthenticationTimeStart is not null and @AuthenticationTimeStart!=‘‘) and (a.AuthenticationTime>@AuthenticationTimeStart) )
 --and ( (@AuthenticationTimeEnd is not null and @AuthenticationTimeEnd!=‘‘) and (a.AuthenticationTime<[email protected]) )

 and (a.AuthenticationTime>=@AuthenticationTimeStart or @AuthenticationTimeStart is null)
 and (a.AuthenticationTime<=@AuthenticationTimeEnd or @AuthenticationTimeEnd is null) 

 --and ( (@CarCategory is not null and @CarCategory!=‘‘) and ([email protected]) )
 and (c.CarCategory=@CarCategory or @CarCategory is null ) 

 --and ( (@BuyTimeStart is not null and @BuyTimeStart!=‘‘) and ( c.BuyTime>@BuyTimeStart) )
 --and ( (@BuyTimeEnd is not null and @BuyTimeEnd!=‘‘) and ( c.BuyTime<[email protected]) )

 and (c.BuyTime>=@BuyTimeStart or @BuyTimeStart is null)
 and (c.BuyTime<=@BuyTimeEnd or @BuyTimeEnd is null) 

 and d.Region<>‘‘
 and d.Region<>‘-‘
 group by  c.CarCategory, d.Region
 ;

 end
 

解析:   and (c.BuyTime<[email protected] or @BuyTimeEnd is null)

首先 and 条件后面是括号,那就说明括号 是一个整体,  括号里面 用的 or 语法,也就说明只要任意一个条件满足就ok, 当参数为空的时候,假如作为条件的字段是时间格式的,如果做大小比较肯定会失败,这个时候后面的 or的条件满足了,就把前面的给忽略了,其实这个时候就相当于  and 1=1 了,

时间: 2024-10-10 13:37:10

sql 存储过程参数为空则不作为条件的相关文章

sql 存储过程参数是表类型,数据库中如何调用

DECLARE @NEW_STUDENT as [CancelLendersContent] INSERT @NEW_STUDENT VALUES (0,0,0,'12345678912','张三','98765432198','李斯',0,0,3,0,10,3,0.5,0) ; EXEC [UpdateInvestorApply] @NEW_STUDENT ,'wc'

参数为空取全部数据的几种做法

润乾报表中支持用户通过参数对数据过滤,而当多个条件联合查询时,如果某个条件没有输入值,用户会希望该条件失效,也就是条件为空则视为没有这个条件,取出所有满足其它条件的数据. 例如,按照地区查询,参数值输入东北,则报表展示如下: 如该参数为空,则结果如下: 下面通过一个订单信息表来看下该需求的实现过程. 首先在报表设计器中制作一个网格式报表,如图: 并在该报表的基础上增加两个参数用于数据过滤: area:用于接收参数对地区进行过滤 amount:接收参数对订单金额过滤 接下来更改数据集,增加参数过滤

SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法

本文出处: http://www.cnblogs.com/wy123/p/5958047.html 最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种写法的区别,以及该用那种写法专业DBA以及熟悉数据库的同学请无视. 废话不多,上代码说明,先造一个测试表待用,简单说明一下这个表的情况 类似订单表,订单表有订单ID,客户ID,订单创建时间等,查询条件是

在SQL存储过程中给条件变量加上单引号

在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @where= '(DATEDIFF(day,'''+CONVERT(varchar(100), @d_start, 23)+''',sdate)>=0 and DATEDIFF(day,'''+CONVERT(varchar(100), @d_end, 23)+''',sdate)<=0) and ' +

sql server 2008存储过程参数

--使用存储过程参数 --包括输入参数和输出参数,以及参数的默认值 --指定参数名称和数据类型 --输入参数允许用户将数据值传递到存储过程或者函数 --输出参数允许存储过程将数据值或者游标变量传递给用户 --存储过程的参数在创建时应该在create procedure 和as关键值之间定义,每个参数都有指定参数名和数据类型,参数名必须以 [email protected]开头为前缀,各个参数定义之间用逗号隔开 [email protected]_name data_type[=default][

存储过程中使用参数和变量作为查询条件对性能的影响?

今日匆忙中写了2各存储过程,查询的表,查询的结构,返回的值基本一样,就是对参数的使用有点不同. 晚上到家想着优化下,看看能不能合并了.在几次重写后,拿着几个版本查看执行计划时,发现个以前没注意的问题. 第一个SP传入的2个时间参数直接用于里面的查询条件. 第二个SP传入的2个时间参数,在SP内又定义了2个时间变量,将参数通过简单计算后Set给了2个变量,然后在查询中使用这2个变量作为条件. 这2个SP,在执行开销上相差数倍. 在外面套一层SP,把时间算好了再当参数传给第二个SP,修改SP直接使用

sql 解析字符串添加到临时表中 sql存储过程in 参数输入

sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneColumnTabel('001,gf', ',') select * from 表 where ID in (select id from 临时表) Create function [dbo].[Func_SplitOneColumnTabel] (@str nvarchar(max),@split v

finereport报表,使用带参数的sql存储过程,报没有返回数据集的错

原因:在SqlServer数据库中,若定义的存储过程中包含有insert/update等更新操作时,在设计器中对存储过程进行调用时,会提示没有返回数据集的错误. 解决方法:修改存储过程,在begin 后面添加 SET NOCOUNT ON. 不管多复杂的sql存储过程 只需要在第一个大的begin后面添加 如下: ALTER proc [dbo].[proc_enterylist] @qybm varchar(50),@strWhere varchar(2000)='',@stratrow in

SQL存储过程笔记

一.概述 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 优点: