2012-03-15 60 views
3

以下存储过程的工作原理,但我想知道 - 是否有最佳做法/模式来处理SQL Server中的这种类型的操作?实质上,我传递了两个不同的参数。根据传递给“criteria”参数的内容,我在where子句中运行带有特定条件的查询 - 谢谢。多标准存储过程最佳实践/模式

ALTER PROCEDURE [dbo].[Select_Project_Info_By_Value] 
    (
    @value VarChar(50), 
    @criteria VarChar(50) 
    ) 

    AS 
    BEGIN 
     SET NOCOUNT ON; 

    if @criteria= 'All' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (NOT (Status = 'ABC')) 

    else if @criteria = 'X' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (Matno LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 

    else if @criteria = 'Y' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (ID LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 

    else if @criteria = 'Z' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (ProDescr LIKE '%' + @value + '%') 

    else if @criteria = 'A' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (CustCode LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 

    else if @criteria = 'B' 
     SELECT  some some tables... 
     FROM   dbo.Table1 
     WHERE  (ApplName LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 

    END 

回答

0

也许是这样的:

SELECT some some tables... 
FROM   
    dbo.Table1 
WHERE 
    (
     @criteria= 'All' 
     AND (NOT (Status = 'ABC')) 
    ) 
    OR 
    (
     @criteria = 'X' 
     AND (Matno LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 
    ) 
    OR 
    (
     @criteria = 'Y' 
     AND (ID LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 
    ) 
    OR 
    (
     @criteria = 'Z' 
     AND (ProDescr LIKE '%' + @value + '%') 
    ) 
    OR 
    (
     @criteria = 'A' 
     AND (CustCode LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 
    ) 
    OR 
    (
     @criteria = 'B' 
     AND (ApplName LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) 
    ) 
0

在where子句和动态搜索条件已经写了厄兰Sommarskog可选参数的明确工作。 This article详细介绍了每种方法的优缺点(其中有很多)。该链接适用于SQL 2005及更早版本。对于2008年,使用此链接(http://www.sommarskog.se/dyn-search-2008.html)

如果我是你,我会审查文章,并选择一种方法,虽然你的查询不能真正优化不管你如何写它。您的LIKE '%' + @value + '%'查询不能使用索引,并且您将始终执行表扫描。

在这种情况下,您可能会遇到参数嗅探问题,因为不同的输入参数可能会产生非常不同的查询计划或通过代码的路径。这个proc可能是WITH RECOMPILE选项的一个好选择。