如何在存储过程中动态添加到TSQL where子句

|| 如何动态地向TSQL Where子句添加条件?我试图避免在两个完整的Select语句之间进行选择。以下内容与我的实际代码非常相似,但不那么复杂。
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子句条件。     
已邀请:
        我不确定是要包含还是要排除,但这里有个问题。
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\'));
    
        它应该看起来像这样... 如果我使用的数据类型不正确,则应更改它们。 但是主要概念应该保持不变。 让我知道事情的后续。
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
    
        您可以将查询转储到varchar,然后使用if语句有选择地附加额外的where子句信息,然后将整个内容传递给sp_executesql。     
        
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值     

要回复问题请先登录注册