【问题标题】:Bypassing the WHERE clause when the filter parameter comes as null当过滤器参数为空时绕过 WHERE 子句
【发布时间】:2018-05-31 08:30:20
【问题描述】:

我有一个过程,需要绕过输入为空的 WHERE 子句。

请找出以下条件。

CREATE PROCEDURE [dbo].[spPERSON_SELECT]    
(
@PersonID INT = NULL,
@OrganizationID INT = NULL,
@ManagerID INT = NULL 
)
AS

BEGIN
SELECT PERSON.name, ORGANIZATION.name,PERSON.manager 
FROM PERSON 
    INNER JOIN ORGANIZATION 
        ON PERSON.person_id = ORGANIZATION.person_id    
WHERE PERSON.person_id = @PersonID  
    and ORGANIZATION.organization_id = @OrganizationID  
    and PERSON.manager_id = @ManagerID 

END
GO

当输入为空时我面临一个问题,在这种情况下需要避免 where 条件。

例子:

如果@PersonID 为空,那么我的选择查询需要以下结构:

SELECT PERSON.name, ORGANIZATION.name,PERSON.manager 
FROM PERSON 
    INNER JOIN ORGANIZATION 
        ON PERSON.person_id = ORGANIZATION.person_id    
WHERE ORGANIZATION.organization_id = @OrganizationID
    and PERSON.manager_id = @ManagerID 

我想避免动态查询。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    将每个参数括起来并测试是否为空,即

    (PERSON.manager_id=@ManagerID or @ManagerID is NUll)
    

    【讨论】:

    • 我喜欢这个答案
    【解决方案2】:

    我个人最喜欢的方法是:

    WHERE PERSON.manager_id = COALESCE(@ManagerID, PERSON.manager_id)

    为每个参数使用coalesce 看起来更好。

    即使@ManagerID IS NULL 也会匹配,因为它总是匹配自身PERSON.manager_id,但如果@ManagerID IS NOT NULL 则停止。

    值得注意的是,您可以给COALESCE(expression1, expression2, n) 提供任意数量的参数。

    【讨论】:

    • 请注意,此方法可能会导致表扫描,这可能会导致大表的性能问题。这是权宜之计,但价格昂贵。
    • 同意@Stuart。 Coalesce 和 IsNull 是坏消息。见 Jeff Smith 的博文link
    【解决方案3】:
    SELECT PERSON.name, ORGANIZATION.name, PERSON.manager 
    FROM PERSON 
    INNER JOIN ORGANIZATION ON PERSON.person_id=ORGANIZATION.person_id
    WHERE 
    (@PersonID is null or PERSON.person_id=@PersonID) 
    and (@OrganizationID is null or ORGANIZATION.organization_id=@OrganizationID)
    and (@ManagerID is null or PERSON.manager_id=@ManagerID) 
    

    【讨论】:

    • 应该指出,您可以在过程中使用 OPTION (RECOMPILE) 来提高 SQL 2008 SP1 CU5 (10.0.2746) 和 SQL 2008 R2 CU1 (10.50.1702) 及更高版本的性能。因为它坐在那里,优化器可能不会使用选择性索引。您也可以从参数嗅探中遇到更多麻烦。这是一个很长但很好的here。在标题 STATIC SQL 下查看。如果您使用的是早期版本,则 [此处] (sommarskog.se/dyn-search-2005.html) 在 STATIC SQL 下有一些指导。
    猜你喜欢
    • 2015-10-19
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2023-03-27
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多