SQL Server程序,其中IS NULL或参数如给出错误的结果

时间:2015-10-08 03:37:00

标签: sql-server stored-procedures

我有一张这样的表

CREATE TABLE [dbo].[TEST_FIND]
(
    [UNIT1] [nvarchar](50) NULL,
    [UNIT2] [nvarchar](50) NULL,
    [UNIT3] [nvarchar](50) NULL,
    [UNIT4] [nvarchar](50) NULL
) ON [PRIMARY]

,该表中的数据如下所示

UNIT1 | UNIT2 | UNIT3 | UNIT4
a     | b     | c     | d
null  | b     | null  | null
null  | null  | c     | null
null  | null  | null  | d
a     | null  | null  | null

我的存储过程是:

CREATE PROCEDURE [dbo].[A_TEST]
    @UNIT1 nvarchar(50) = NULL,
    @UNIT2 nvarchar(50) = NULL,
    @UNIT3 nvarchar(50) = NULL,
    @UNIT4 nvarchar(50) = NULL
AS
BEGIN
    SELECT
        UNIT1, UNIT2, UNIT3, UNIT4
    FROM
       TEST_FIND
    WHERE
       @UNIT1 is null or UNIT1 like '%'+@UNIT1+ '%' AND
       @UNIT2 is null or UNIT2 like '%'+@UNIT2+ '%' AND
       @UNIT3 is null or UNIT3 like '%'+@UNIT3+ '%' AND
       @UNIT4 is null or UNIT4 like '%'+@UNIT4+ '%'
END

问题是,当我这样称呼我的程序时:

exec A_TEST 'a', null, null, null 

结果还可以(只需从表TEST_FIND显示,其中UNIT 1是'a')

但使用时

exec A_TEST null, 'b', null, null

结果是

select * from TEST_FIND

我不知道为什么,问题是什么

需要尽快解决这个问题,帮帮我

由于

2 个答案:

答案 0 :(得分:1)

WHERE条款分组后会发生什么?像这样:

WHERE
   ( @UNIT1 is null or UNIT1 like '%'+@UNIT1+ '%' )
   AND
   ( @UNIT2 is null or UNIT2 like '%'+@UNIT2+ '%' )
   AND
   ( @UNIT3 is null or UNIT3 like '%'+@UNIT3+ '%' )
   AND
   ( @UNIT4 is null or UNIT4 like '%'+@UNIT4+ '%' )
END

答案 1 :(得分:0)

在AND条件中使用括号。

 CREATE PROCEDURE [dbo].[A_TEST]
@UNIT1 nvarchar(50) = NULL,
@UNIT2 nvarchar(50) = NULL,
@UNIT3 nvarchar(50) = NULL,
@UNIT4 nvarchar(50) = NULL
   AS
     BEGIN
       SELECT
        UNIT1,
     UNIT2,
     UNIT3,
     UNIT4
FROM
   TEST_FIND
    WHERE
  (@UNIT1 is null or UNIT1 like '%'+@UNIT1+ '%') AND
  (@UNIT2 is null or UNIT2 like '%'+@UNIT2+ '%' )AND
  (@UNIT3 is null or UNIT3 like '%'+@UNIT3+ '%')AND
  (@UNIT4 is null or UNIT4 like '%'+@UNIT4+ '%')
END