如何向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条款条件。
答案 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值