如何动态添加到存储过程中的TSQL Where子句

时间:2011-06-21 20:19:30

标签: sql-server tsql

如何向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';

我希望能够根据存储过程参数的值添加或删除最后两个条件。

ie:如果@ExcludePhoneOrders = False,请不要使用最后两个Where条款条件。

4 个答案:

答案 0 :(得分:5)

我不确定你是打算包含还是排除,但这里有一个刺。

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'));

答案 1 :(得分:2)

应该看起来像这样...... 如果我使用的数据类型不正确,您应该更改它们。 但主要概念应该保持不变。 让我知道它是怎么回事。

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

答案 2 :(得分:1)

您可以将查询转储到varchar,然后使用if语句可选地追加额外的where子句info,然后将整个内容传递给sp_executesql。

答案 3 :(得分:1)

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值