SQL Server 2008 sp с аргументом nullable bit arg: как избежать if / else для выбора? - PullRequest
0 голосов
/ 11 октября 2011

Как можно избежать if / else, пожалуйста? Столбец «Активный» не может быть пустым в таблице.

CREATE   procedure spExample(@bitActive bit)
as

if @bitActive is not null
    select      a.PKID 
    from        Alerts a 
    where       a.Active = @bitActive
else
    select      a.PKID 
    from        Alerts a 

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Или, вы можете пойти с

select      a.PKID 
from        Alerts a 
where       ISNULL(@bitActive, a.Active) = a.Active

Это по сути то же самое, что и предыдущий ответ, но избегает использования ИЛИ в Где.

Я должен отметить, что вы можете получить более высокую производительность, используя ваш текущий код, так как это позволяет избежать выполнения теста IS NULL в каждой строке. Если вы используете индексы для ваших данных, тест IS NULL может означать, что оптимизатор запросов вашего ядра СУБД не может использовать индексы, которые могут привести к неоптимальному пути выполнения.

По опыту могу сказать, что мы заметили значительное улучшение (от минут до секунд), удалив проверки ISNULL и написав SQL, специфичный для параметров, с помощью операторов IF или динамического SQL.

Мы используем Sql Server 2008, поэтому ваш пробег может отличаться, если вы используете другой движок. Я предлагаю вам сделать несколько тестов, чтобы увидеть, есть ли какие-либо проблемы с производительностью в вашей базе данных.

Cheers, Дин.

1 голос
/ 11 октября 2011
select      a.PKID 
from        Alerts a 
where       @bitActive IS NULL OR a.Active = @bitActive
...