SProc中的条件WHERE无法正常工作

时间:2013-08-27 13:52:32

标签: sql stored-procedures null conditional where

好的,所以我试图创建一个包含条件WHERE子句的存储过程。它使用初始化为NULL的命名参数,然后根据它们在调用语句时是否仍为null或者是否具有值来确定是否将它们添加到WHERE语句。

该陈述的一个例子是:

 CREATE PROCEDURE Sp_myconditionalproc (@xVariable VARCHAR(10) = NULL, 
                                       @yVariable VARCHAR(50) = NULL) 
AS 
  BEGIN 
      SELECT * 
      FROM   [MyDB].[dbo].[MYTABLE] 
      WHERE  X = CASE 
                   WHEN @xVariable <> NULL THEN @xVariable 
                   ELSE X 
                 END 
             AND Y = CASE 
                       WHEN @yVariable <> NULL THEN @yVariable 
                       ELSE Y 
                     END 
  END 

然后使用

调用它
EXECUTE Sp_myconditionalproc 
  @xVariable = 'C', 
  @yVariable = 'AB'; 

出于某种原因,这不会返回我期待的结果。而不是给我xVariable是'C'的结果,它给了我所有的结果,无论xVariable是什么。与xVariable相同。基本上 - 无论我放在那里,都会返回整个表格。

这是我第一次尝试这样的事情,所以我可能会遇到一些巨大的缺陷,但我不知道它是什么。有人可以帮助我弄清楚我在这里做错了什么以及如何纠正它,这样我只能传入我想要搜索的变量?

谢谢! = d

1 个答案:

答案 0 :(得分:1)

你对NULL如何工作有误解。

没有任何等于或不等于NULL,因此@xVariable <> NULL将永远是假的!

尝试使用ISNULL以将NULL替换为其他值,或与IS NULL进行比较。
试试这个:

CREATE PROCEDURE Sp_myconditionalproc (@xVariable VARCHAR(10) = NULL, 
                                       @yVariable VARCHAR(50) = NULL) 
AS 
  BEGIN 
      SELECT * 
      FROM   [MyDB].[dbo].[MYTABLE] 
      WHERE  X = CASE 
                   WHEN @xVariable IS NOT NULL THEN @xVariable 
                   ELSE X 
                 END 
             AND Y = CASE 
                       WHEN @yVariable IS NOT NULL THEN @yVariable 
                       ELSE Y 
                     END 
  END 

或者这个:

CREATE PROCEDURE Sp_myconditionalproc (@xVariable VARCHAR(10) = NULL, 
                                       @yVariable VARCHAR(50) = NULL) 
AS 
  BEGIN 
      SELECT * 
      FROM   [MyDB].[dbo].[MYTABLE] 
      WHERE  X = Isnull(@xVariable, X) 
             AND Y = Isnull(@yVariable, Y) 
  END 

祝你好运!