2013-07-16 52 views
2

我有一個過程,並且需要繞過輸入爲空的WHERE子句。當filter參數爲空時繞過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 

Iam面臨的一個問題,而輸入爲空,在這種情況下,需要避免在哪裏條件。

例子:

如果@PersonID爲null,則我的選擇查詢需要的結構如下:

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 

我想避免動態查詢。

回答

2
SELECT PERSON.name, ORGANIZATION.name,PERSON.manager FROM PERSON INNER JOIN ORGANIZATION ON PERSON.person_id=ORGANIZATION.person_id 
WHERE 
(@PersonID is null or [email protected]) 
and (@OrganizationID is null or [email protected]) 
and (@ManagerID is null or [email protected]) 
+0

應該指出你可以提高SQL 2008 SP1 CU5(10.0.2746)和SQL 2008 R2 CU1(10.50.1702)中的性能,並在程序中使用OPTION(RECOMPILE)。當它位於優化器時可能不會使用選擇性索引。您也可以從參數嗅探中獲得更多的麻煩。這裏是一個很長但很好的[這裏](http://www.sommarskog.se/dyn-search-2008.html#SPandCUs)。在STATIC SQL標題下查找。如果您使用的是較早的版本,則在STATIC SQL下有一些指導[此處](http://www.sommarskog.se/dyn-search-2005.html)。 – kheld

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)提供任意數量的參數。

+0

請注意,此方法可能導致表掃描,這可能會導致大型表上的性能問題。這很方便,但很昂貴。 –

+0

同意@Stuart。 Coalesce和IsNull是個壞消息。見Jeff Smith的博客文章[link](http://weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspx) – kheld