Лучший способ написать запрос с 4-мя возможными путями? - PullRequest
0 голосов
/ 13 февраля 2010

Возможно, не самый лучший титул, но в любом случае ..

У меня есть хранимая процедура, которая до сих пор имела 1 необязательный параметр, который я легко решал с помощью 1 оператора if. Теперь он имеет 2, что доводит до 4 операторов if. Я хотел бы знать, если есть лучший способ написать запрос, чем следующее. Особенно, если / когда число переменных увеличивается до 4 или 5.

Я ищу более простой способ добавить эту новую переменную ignoreTheseIds без необходимости добавлять еще 2 оператора if / else.

ALTER PROCEDURE [dbo].[SomeQuery]
    @StartingDate varchar(10) = '1/1/1900',
    @EndingDate varchar(10) = NOW,
    @LimitToTheseIds varchar(MAX) = ''
    @IgnoreTheseIds varchar(MAX) = ''
AS

BEGIN
    SET NOCOUNT ON;

    IF @LimitTo = ''
    BEGIN
        SELECT id1, col2
        FROM Table1 as T
        WHERE SomeDateTime <= @EndDate
          AND SomeDateTime >= @StartDate
    END
    ELSE
    BEGIN
        SELECT id1, col2
        FROM Table1 as T
        WHERE SomeDateTime <= @EndDate
            AND SomeDateTime >= @StartDate
            AND @LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%'
    END
END

Надеюсь, я ничего не испортил при изменении имен переменных ...

Ответы [ 5 ]

2 голосов
/ 13 февраля 2010

Это самая полная статья о состоянии динамического поиска, с которой я когда-либо сталкивался:

http://www.sommarskog.se/dyn-search.html

2 голосов
/ 13 февраля 2010

Вы можете проверить, передано ли вообще что-либо:

ALTER PROCEDURE [dbo].[SomeQuery] 
    @StartingDate varchar(10) = '1/1/1900', 
    @EndingDate varchar(10) = NOW, 
    @LimitToTheseIds varchar(MAX) = '' 
    @IgnoreTheseIds varchar(MAX) = '' 
AS 

BEGIN 
    SET NOCOUNT ON; 

    SELECT id1, col2 
    FROM Table1 as T 
    WHERE SomeDateTime <= @EndDate 
        AND SomeDateTime >= @StartDate 
        AND (@LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%' 
        OR @LimitToTheseId = '')
END 
0 голосов
/ 13 февраля 2010
  SELECT id1, col2
FROM Table1 as T
WHERE SomeDateTime <= @EndDate
    AND SomeDateTime >= @StartDate
AND (@LimitToTheseIds IS NULL OR @LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%')
0 голосов
/ 13 февраля 2010

Для этого вы можете использовать оператор CASE, хотя вам нужно проверить, получаете ли вы при этом эффективность. Примерно так:

ALTER PROCEDURE [dbo].[SomeQuery]
    @StartingDate varchar(10) = '1/1/1900',
    @EndingDate varchar(10) = NOW,
    @LimitToTheseIds varchar(MAX) = ''
    @IgnoreTheseIds varchar(MAX) = ''
AS

BEGIN
    SET NOCOUNT ON;

    SELECT id1, col2
    FROM Table1 as T
    WHERE SomeDateTime <= @EndDate
        AND SomeDateTime >= @StartDate
        AND @LimitToTheseIds LIKE CASE WHEN @LimitToTheseIds = '' THEN '' ELSE '%|' + CAST(id1 as varchar) + '|%' END
        AND @IgnoreTheseIds LIKE CASE WHEN @IgnoreTheseIds = '' THEN '' ELSE /*something appropriate here*/
END

и т.д.

0 голосов
/ 13 февраля 2010

Когда мне приходилось писать такие большие SPROCS, как я, я добавил переменную «Type», которая пошла бы к определенному оператору в SPROC. Например:

@queryType = 'A'

if @queryType = 'A'
 begin
  --do query A
 end

if @queryType = 'B'
 begin
  --do query B
 end

--etc.

В итоге получилось немного чище, чем иметь несколько деревьев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...