2010-05-11 58 views
1

我有以下TSQL,3个ID(@EmpID,@DeptID和@CityID)被传入,它可以全部为NULL或任何一个可以为NULL。请参见下面的场景:TSQL - 使之更好

 

-- Very Narrow (all IDs are passed in) 
IF(@EmpID IS NOT NULL AND @DeptID IS NOT NULL AND @CityID IS NOT NULL) 
    BEGIN  
     SELECT 
     e.EmpName 
     ,d.DeptName 
     ,c.CityName 
     FROM 
     Employee e WITH (NOLOCK) 
     JOIN Department d WITH (NOLOCK) ON e.deptid = d.deptid 
     JOIN City c WITH (NOLOCK) ON e.CityID = c.CityID 
     WHERE 
     e.EmpID = @EmpID 
    END 
-- Just 2 IDs passed in 
ELSE IF(@DeptID IS NOT NULL AND @CityID IS NOT NULL) 
    BEGIN 
     SELECT 
     e.EmpName 
     ,d.DeptName 
     ,NULL AS [CityName] 
     FROM 
     Employee e WITH (NOLOCK) 
     JOIN Department d WITH (NOLOCK) ON e.deptid = d.deptid 
     JOIN City c WITH (NOLOCK) ON e.CityID = c.CityID 
     WHERE 
     d.deptID = @DeptID 
    END 
-- Very Broad (just 1 ID passed in) 
ELSE IF(@CityID IS NOT NULL) 
    BEGIN 
     SELECT 
     e.EmpName 
     ,NULL AS [DeptName] 
     ,NULL AS [CityName] 
     FROM 
     Employee e WITH (NOLOCK) 
     JOIN Department d WITH (NOLOCK) ON e.deptid = d.deptid 
     JOIN City c WITH (NOLOCK) ON e.CityID = c.CityID 
     WHERE 
     c.CityID = @CityID 
    END 
-- None (Nothing passed in) 
ELSE 
    BEGIN 
     SELECT 
     NULL AS [EmpName] 
     ,NULL AS [DeptName] 
     ,NULL AS [CityName] 
    END 

 

问:有没有更好的办法(OR我具体什么都可以做,而不IF ... ELSE条件

回答

1

有很多方法可以做到这一点,关键是要生产? 。将使用索引的查询

一些常见的有:
x = @x OR @x IS NULL
Using IF statements
eliminate nulls by using min and max values
Dynamic SQL
OPTION (RECOMPILE), on certain versions of SQL Server 2008

此链接将解释那些和几个:http://www.sommarskog.se/dyn-search.html

看一看以前,还没有类似的问题:
Optimal search queries

Implementing search functionality with multiple optional parameters against database table

在您的特定代码示例你可能想添加dbo。或任何架构是每个表的名称,以便每个用户没有得到他们自己的版本中的缓存看到:http://www.sommarskog.se/dynamic_sql.html#queryplans

您可能还需要担心参数嗅探,请参阅:http://www.sommarskog.se/dyn-search-2005.html#OR_ISNULL