Использование параметра tristate в хранимой процедуре - PullRequest
1 голос
/ 10 октября 2008

Как правильно это сделать? Например, как бы я изменил хранимую процедуру с такой подписью:

CREATE PROCEDURE dbo.MyProcedure
  @Param BIT = NULL
AS
  SELECT *
  FROM dbo.SomeTable T
  WHERE T.SomeColumn = @Param

То есть, если задание @Param со значением 1 или 0 выполняет фильтр, но без его указания или пропуск NULL не выполняет фильтрацию?

Ответы [ 3 ]

5 голосов
/ 10 октября 2008

Предполагая, что NULL означает "все равно", используйте

CREATE PROCEDURE dbo.MyProcedure 
   @Param BIT = NULL
AS
   SELECT *
   FROM dbo.SomeTable T
   WHERE T.SomeColumn = @Param OR @Param IS NULL
1 голос
/ 10 октября 2008

Есть несколько способов. Вот один из них:

SELECT *
  FROM dbo.SomeTable T
  WHERE T.SomeColumn = COALESCE(@Param, T.SomeColumn)

, но это не будет включать строки, для которых T.SomeColumn равен NULL.

Следующая альтернатива будет включать эти строки:

SELECT *
  FROM dbo.SomeTable T
  WHERE T.SomeColumn = @Param OR @Param IS NULL

но он имеет недостаток повторяющегося параметра, что не очень хорошо, если вы используете другой способ передачи параметров, например, с использованием заполнителя.

0 голосов
/ 10 октября 2008

Мне кажется, что самый чистый способ сделать это (в T-SQL):

SELECT * FROM TABLE WHERE column = ISNULL(@param, column)

Другие СУБД предпочли бы COALESCE вместо ISNULL.

Я думаю, что здесь более очевидно, что вы собираетесь делать, особенно когда вы начинаете добавлять другие операторы OR, и это также избавляет вас от необходимости использовать скобки при объединении с предложениями AND.

В моем (очень) ограниченном тестировании было также незначительное увеличение производительности при использовании ISNULL по сравнению с OR @p IS NULL. Не то чтобы я выступал за использование ISNULL , потому что увеличения производительности (которое в лучшем случае крайне незначительно, а в худшем случае - очень специфические случаи), но приятно знать, что оно не имеет значительных затрат , Честно говоря, я не уверен, почему это так или иначе будет иметь значение, но план выполнения показывает разницу в стоимости фильтра на 1%.

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