问题描述
||
如何动态地向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值