Многокритериальная наилучшая практика / шаблон хранимой процедуры - PullRequest
3 голосов
/ 16 марта 2012

Следующая хранимая процедура работает, но мне интересно - есть ли лучший метод / шаблон для работы с этим типом действий в 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

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Работа , определяющая необязательных параметров, в которой предложения и условия динамического поиска были написаны Эрландом Соммарскогом. В этой статье подробно описываются преимущества и недостатки каждого подхода (которых много). Эта ссылка предназначена для SQL 2005 и более ранних версий.В 2008 году используйте эту ссылку (http://www.sommarskog.se/dyn-search-2008.html)

Если бы я был вами, я бы прочитал статью и выбрал подход, хотя ваш запрос не может быть оптимизирован, независимо от того, как вы его пишете. В ваших запросах LIKE '%' + @value + '%' не может использоваться индекси вы всегда будете выполнять сканирование таблиц.

В такой ситуации вы можете столкнуться с проблемами со сниффингом параметров, так как разные входные параметры могут привести к очень разным планам запросов или путям в коде.хороший кандидат на вариант WITH RECOMPILE.

0 голосов
/ 16 марта 2012

Может быть, что-то вроде этого:

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'))
   )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...