【问题标题】:Conditional WHERE in SProc not workingSProc 中的条件 WHERE 不起作用
【发布时间】:2013-08-30 07:37:09
【问题描述】:

好的,所以我正在尝试创建一个包含条件 WHERE 子句的存储过程。它使用初始化为 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

【问题讨论】:

标签: sql stored-procedures null conditional where


【解决方案1】:

您对 NULL 的工作原理存在误解。

没有任何东西等于或不等于NULL,因此@xVariable &lt;&gt; 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 

祝你好运!

【讨论】:

  • 成功了!我不敢相信我犯了那个错误。非常感谢您的帮助=D
猜你喜欢
  • 2022-01-04
  • 2023-03-27
  • 2013-12-31
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多