Как динамически добавить предложение TSQL Where в хранимой процедуре - PullRequest
3 голосов
/ 22 июня 2011

Как динамически добавить условия в предложение TSQL Where?

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

SELECT COUNT(*)
FROM   MyTable
WHERE  ShipDate >= @FirstDayOfMonth
AND    ShipDate <  @LastDayOfMonth
AND    OrderType = 1
AND    NOT OrderCode LIKE '%3'
AND    NOT OrderCode LIKE '%4';

Я хотел бы иметь возможность добавлять или удалять два последних условия в зависимости от значения параметра хранимой процедуры.* т.е.: если @ExcludePhoneOrders = False, не используйте два последних условия условия Where.

Ответы [ 4 ]

5 голосов
/ 22 июня 2011

Я не уверен, что вы хотели включить или исключить, но вот удар по нему.

SELECT COUNT(*)
FROM   MyTable
WHERE  ShipDate >= @FirstDayOfMonth
AND    ShipDate <  @LastDayOfMonth
AND    OrderType = 1
AND    (@ExcludePhoneOrders = False OR (NOT OrderCode LIKE '%3' AND NOT OrderCode LIKE '%4'));
2 голосов
/ 22 июня 2011

Это должно выглядеть примерно так ... Если тип данных, который я использовал, неверен, вы должны изменить их.Но основная концепция должна оставаться прежней.Дайте мне знать, как это происходит.

Create proc GetOrders
   ....,
   @FirstDayOfMonth int,
   @LastDayOfMonth int,
   ....
AS
DECLARE @SQL varchar(1000)
DECLARE @PARAMS nvarchar(100);

set @SQL='SELECT COUNT(*) FROM   MyTable WHERE  ShipDate >= @FirstDay_OfMonth AND    ShipDate <  @LastDay_OfMonth AND    OrderType = 1';

if(@ExcludePhoneOrders = 1)
begin
  set @SQL=@SQL + ' AND NOT OrderCode LIKE ''%3'' AND NOT OrderCode LIKE ''%4'''
end

SET @PARAMS = '@FirstDayOfMonth int, @LastDayOfMonth int'
EXECUTE sp_executesql @SQL, @PARAMS, @FirstDay_OfMonth = @FirstDayOfMonth, @LastDay_OfMonth=@LastDayOfMonth
GO
1 голос
/ 22 июня 2011
SELECT COUNT(*)
FROM   MyTable
WHERE  ShipDate >= @FirstDayOfMonth
AND    ShipDate <  @LastDayOfMonth
AND    OrderType = 1
AND (
    (@ExcludePhoneOrders <> False AND NOT OrderCode LIKE '%3' AND NOT OrderCode LIKE '%4')
    OR
    @ExcludePhoneOrders = False 
)

Вам нужно учитывать значение дескриптора NULL, если параметр может быть NULL

1 голос
/ 22 июня 2011

Вы можете вывести запрос в varchar, затем использовать оператор if для необязательного добавления дополнительной информации о предложении where, а затем передать все это в sp_executesql.

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