SQL Server 2000 ветвление хранимых процедур с параметрами - PullRequest
2 голосов
/ 17 ноября 2009

Я хочу создать хранимую процедуру. Если параметр равен -1, тогда в этом столбце не должно быть предложения where, в противном случае должно быть предложение WHERE. Какой лучший способ сделать это без большого количества ветвлений IF?

Я проверил архив. Есть несколько похожих вопросов, но они не совпадают.

CREATE PROCEDURE report
(
  @site int,
  @promo int,
  @type int
)
AS
SET NOCOUNT ON

-- I want to avoid this:
IF @site = -1 AND @promo = -1 and @type = -1
BEGIN
  SELECT * from table
END
IF @site > -1 AND @promo = -1 and @type = -1
BEGIN
  SELECT * from table WHERE site = @site;
END
... -- other cases


ELSE  -- all parameters are > -1
BEGIN
  SELECT * from table 
  WHERE site = @site AND promo = @promo AND type = @type
END

Ответы [ 3 ]

3 голосов
/ 17 ноября 2009

Это работает во многих случаях (несмотря на то, что в комментариях будет сказано, не пытаясь это сделать), потому что оптимизатор будет игнорировать бит ISNULL. Работает только для ненулевых столбцов

SELECT @site = NULLIF(@site, -1) ...

SELECT * from table  
  WHERE site = ISNULL(@site, site) ..

В противном случае, условно ГДЕ, что обычно плохо, потому что ИЛИ не может быть оптимизировано

SELECT * from table  
  WHERE (@site = -1 OR site = @site) AND  (...

Или отдельные хранимые процедуры (не думаю, что вы тоже этого хотите)

Или используйте sp_executesql (избегает динамического SQL)

1 голос
/ 17 ноября 2009

зачем бороться с очевидным, самым простым решением?

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

1 голос
/ 17 ноября 2009

Как насчет:

SELECT * FROM table WHERE
  ((site = @site) OR (@site = -1)) AND
  ((promo = @promo) OR (@promo = -1)) AND
  ((type = @type) OR (@type = -1))

Однако, одно замечание: вы можете обнаружить, что SQL не очень умен для оптимизации такого рода запросов.

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