【问题标题】:Sql Server 2012 Stored procedure query with where clause is null or input parameterSql Server 2012 存储过程查询,where 子句为空或输入参数
【发布时间】:2014-05-28 19:41:49
【问题描述】:

我想创建一个在 where 子句中使用输入参数的存储过程。该参数将是文本或空值。

即假设我有一张桌子 [tbl]

Status val
NULL   158
Acc    155
Acc    152
Null   24
Rej    34

在 SQL Server 中,可以使用

找到空值
WHERE Status is NULL

我还希望存储过程能够处理参数等于特定值的情况。

WHERE Status = @parameter

如何结合这两种情况?我想要这样的东西。

CREATE PROC test @parameter VARCHAR(10) = ''

SELECT *
FROM [tbl]

IF (@parameter is NULL OR @parameter = '') THEN WHERE STATUS is Null
ELSE WHERE STATUS = @parameter

【问题讨论】:

  • 从您的问题看来,您似乎只希望在 @parameter 为 NULL 或 '' 时获取 NULL 行,但您接受的答案 总是 返回 NULL 行。
  • 你是对的。我刚刚意识到,我会感谢您正确回答问题

标签: sql sql-server stored-procedures


【解决方案1】:
WHERE (ISNULL(@parameter,'') = '' AND Status IS NULL)
   OR Status = @parameter 

只有当@Status 不是NULL 时,上半部分才能评估为真。否则它会回落到下半部分。

ISNULL(@Status,'') = ''@Status IS NULL OR @Status = '' 相同,如果是这种情况,则匹配Status IS NULL 所在的行。

看看你的伪代码,你几乎就在那里(我添加的内容以粗体显示):

IF( (@parameter is NULL OR @parameter = '')THEN WHEREANDSTATUS is Null)
ELSE WHERE OR STATUS = @parameter


刚刚意识到这可能会更好:

WHERE ISNULL(@parameter, '') = ISNULL(Status, '')

它的工作原理相同,但我不确定ISNULL(Status, '') 是否会停止使用索引,因此值得检查执行计划。

【讨论】:

  • 有什么方法可以加快这个过程吗?它运行有点慢
  • where 子句本身不太可能导致问题,您更有可能需要一个包含 Status 列的适当索引。很难在没有看到表格 + 查询的情况下提出建议 - 但是像这样的问题 可能 更适合dba.stackexchange.com - 它也可能完全是关于 SO 的主题,但更好的答案可能在数据库管理员。
【解决方案2】:

只需在您的WHERE 子句中包含这两个条件,这样它就会获取status having null'sstatus having specific value 所在的行

WHERE Status is NULL
OR Status = @parameter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多