Создание хранимой процедуры, имеющей разные предложения WHERE для разных критериев поиска, не помещая все в длинную строку - PullRequest
4 голосов
/ 26 марта 2010

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

Предположим, у меня есть таблица заказов. Я хочу создать хранимую процедуру для этой таблицы, и есть три столбца, по которым я хочу фильтровать записи.

1- CustomerId, 2- SupplierId, 3- ProductId.

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

SELECT * FROM Orders WHERE Orders.CustomerId = @customerId

И если пользователь указывает ProductId только в критериях поиска, запрос должен выглядеть следующим образом:

SELECT * FROM Orders WHERE Orders.ProductId = @productId

И если для пользователя заданы только все три CustomerId, ProductId и SupplierId, то все три идентификатора будут использоваться в WHERE для фильтрации.

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

SELCT * FROM Orders

Всякий раз, когда мне нужно создать такую ​​процедуру, я помещаю все это в строку и использую условия IF, чтобы проверить, имеют ли аргументы (@customeId или @supplierId и т. Д.) Значения.

Я использую следующий метод для создания процедуры

DECLARE @query      VARCHAR(MAX)
DECLARE @queryWhere VARCHAR(MAX)

SET @query = @query + 'SELECT * FROM Orders '

IF (@originationNumber IS NOT NULL)
BEGIN
    BEGIN
        SET @queryWhere =@queryWhere + ' Orders.CustomerId = ' + CONVERT(VARCHAR(100),@customerId)
    END
END

IF(@queryWhere <> '')
BEGIN
   SET @query = @query+' WHERE ' + @queryWhere
END

EXEC (@query)

Спасибо.

Ответы [ 3 ]

6 голосов
/ 26 марта 2010

Вы можете передать NULL для полей, которые вы не хотите включать в ваше WHERE -класс, и проверить в запросе NULL:

Select customerId, productId, supplierId
From Orders
Where ( customerId = @customerId Or @customerId IS NULL )
  And ( productId = @productId Or @productId IS NULL )
  And ( supplierId= @supplierId Or @supplierId IS NULL )

Не используйте SELECT *, всегда перечисляйте столбцы, которые вам действительно нужны.

1 голос
/ 26 марта 2010
Select CustomerId, ProductId, SupplierId
From Orders
Where CustomerId = ISNULL( @customerId, CustomerId   )
  And ProductId = ISNULL( @productId, ProductId  )
  And SupplierId= ISNULL( @supplierId, SupplierId )
0 голосов
/ 26 марта 2010

Erland Sommarskog предлагает отличную пару статей , описывающих различные методы поиска и компромиссы (один для SQL 2008, один для более ранних версий)

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