日期:2014-05-17  浏览次数:20538 次

关于存储过程中动态添加where子句的问题
本帖最后由 wyx177694333 于 2013-04-13 16:49:18 编辑
RT
在一个带有参数的存储过程中,因为参数可为空,所以我想
实现当某一参数为空时,where子句就少一个查询条件。


CREATE PROCEDURE [dbo].[XXXXXXX](
    @COL1 VARCHAR(50)
   ,@COL2 VARCHAR(50)
)
AS
    SELECT 
        A.COL1
      ,A.COL2 
    FROM 
        TABLE1 A 
    WHERE
        A.COL1 = @COL1
    AND
        A.COL2 = @COL2


上面红字的地方要怎么修改啊?以前见别人用NULLIF/ISNULL实现了,但当时没记下来...
SQL 存储过程

------解决方案--------------------
SELECT 
        A.COL1
      ,A.COL2 
    FROM 
        TABLE1 A 
    WHERE
        (@COL1 = NULL or A.COL1 = @COL1)
    AND
        (@COL2 = NULL or A.COL2 = @COL2)
------解决方案--------------------
那就写两组,用if判断一下
if @col1 is null or @col1=''
select ...where xx
else
select ...where xxxx
------解决方案--------------------
CREATE PROCEDURE [dbo].[XXXXXXX]
    (
      @COL1 VARCHAR(50) ,
      @COL2 VARCHAR(50)
    )
AS 
    SELECT  A.COL1 ,
            A.COL2
    FROM    TABLE1 A
    WHERE   A.COL1 = ISNULL(@COL1, A.COL1)
            AND A.COL2 = ISNULL(@COL2, A.COL2)

------解决方案--------------------
那位大侠是对的呢
------解决方案--------------------
不担心性能的话。这种写法最简单。。

declare @KHBH varchar(10) = '%'



select * from KHZLB where isnull(KHBH,'%') like @khbh
------解决方案--------------------
还有一种写法:

CREATE PROCEDURE [dbo].[XXXXXXX]
    (
      @COL1 VARCHAR(50) ,
      @COL2 VARCHAR(50)
    )
AS 
    SELECT  A.COL1 ,
            A.COL2
    FROM    TABLE1 A
    WHERE  nullif(@COL1, A.COL1) is null
       AND nullif(@COL2, A.COL2) is null