1

好的,所以我正在尝试创建一个包含条件 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

4

1 回答 1

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 

祝你好运!

于 2013-08-27T14:04:37.970 回答