【问题标题】:Multi-Criteria stored procedure best practice/pattern多标准存储过程最佳实践/模式
【发布时间】:2012-04-01 09:44:14
【问题描述】:

以下存储过程有效,但我想知道——在 SQL Server 中处理此类操作是否有最佳实践/模式?本质上,我传递了两个不同的参数。根据为“条件”参数传入的内容,我在 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

【问题讨论】:

    标签: sql-server sql-server-2005


    【解决方案1】:

    可能是这样的:

    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'))
       )
    

    【讨论】:

    • 我认为如果条件太多或会导致性能问题。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2017-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      相关资源
      最近更新 更多