Sql 当filter参数为null时绕过WHERE子句

Sql 当filter参数为null时绕过WHERE子句,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个过程,需要绕过WHERE子句WHERE input为null 请查找以下条件 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 INNE

我有一个过程,需要绕过WHERE子句WHERE input为null

请查找以下条件

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
当输入为空时,Iam面临一个问题,在这种情况下需要避免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
例如:

如果@PersonID为null,则我的select查询需要以下结构:

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 

我希望避免动态查询。

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

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

我个人最喜欢的方法是:

其中PERSON.manager\u id=COALESCE(@ManagerID,PERSON.manager\u id)

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

即使
@ManagerID为空
,这也会匹配,因为它总是匹配自身,
PERSON.manager\u id
,但如果
@ManagerID不为空
,则会停止


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

请注意,此方法可能会导致表扫描,这可能会导致大型表的性能问题。这是权宜之计,但代价高昂。同意@Stuart。Coalesce和IsNull都是坏消息。请参阅Jeff Smith的博文。我们应该指出,您可以在SQL 2008 SP1 CU5(10.0.2746)和SQL 2008 R2 CU1(10.50.1702)中以及以后的过程中使用选项(重新编译)来提高性能。由于它处于静止状态,优化器可能不会使用选择性索引。参数嗅探也会给您带来更多麻烦。这是一个很长但很好的例子。查看标题“静态SQL”下的内容。如果您使用的是早期版本,那么在静态SQL下[here]()有一些指导。我喜欢这个答案