我有以下存储过程。
ALTER PROCEDURE [dbo].[spList_Report]
@id INT,
@startDate DATETIME = NULL,
@endDate DATETIME = NULL,
@includeStatus1 BIT,
@includeStatus2 BIT,
@includeStatus3 BIT,
@includeStatus4 BIT
AS
SET NOCOUNT ON
SELECT *
FROM
tblProducts as products
WHERE
product.intID = @id
AND product.dateMain >= @startDate
AND product.dateMain <= @endDate
我知道这可能看起来像一个愚蠢的问题,但如果@startDate AND @endDate都为null,那么我希望它返回行忽略where子句中的日期检查。
非常感谢任何帮助。
答案 0 :(得分:7)
这应该
AND product.dateMain >= ISNULL( @startDate, 0)
AND product.dateMain <= ISNULL( @endDate, product.dateMain + 1)
如果第一个值为null,则 ISNULL
产生第二个值。
因此:
如果@startDate
为空,则dateMain
必须大于0(1900-01-01)
如果@endDate
为空,则dateMain
必须小于dateMain + 1 day
答案 1 :(得分:2)
你可以尝试这样的事情
ALTER PROCEDURE [dbo].[spList_Report]
@id INT,
@startDate DATETIME = NULL,
@endDate DATETIME = NULL,
@includeStatus1 BIT,
@includeStatus2 BIT,
@includeStatus3 BIT,
@includeStatus4 BIT
AS
SET NOCOUNT ON
SELECT *
FROM
tblProducts as products
WHERE
product.intID = @id
AND product.dateMain >= ISNULL( @startDate, product.dateMain )
AND product.dateMain <= ISNULL( @endDate, product.dateMain )
答案 2 :(得分:0)
您可以在Sql中使用“或”,但由于这是一个存储过程:
If @startdate is null Or @enddate is null
begin
select without using a date range
end
Else
begin
select using date range
end
答案 3 :(得分:0)
我会使用Kris Krause的解决方案,但更改“IF”语句以使用“AND”。我想如果你使用前两个解决方案,查询引擎可以在日期字段上执行表/索引扫描。您希望尽可能简洁地保持查询以获得最佳性能,因此不要对不必要的列运行查询。
IF @startdate IS NULL AND @enddate IS NULL
BEGIN
SELECT * FROM tblProducts as products WHERE
product.intID = @id
END
ELSE
BEGIN
SELECT * FROM tblProducts as products WHERE
product.intID = @id
AND product.dateMain >= @startDate
AND product.dateMain <= @endDate
END