Sql server 如何编写WHERE子句以满足SSRS报告上的可选参数?
我试图得到一个基本的SSRS报告,可以通过任何可选参数进行过滤。 要筛选的2个参数应介于2个日期之间或按SalesID筛选。我可以单独筛选每个参数,但当我将它们添加到语句中并尝试运行报告时,它会显示“参数不能为空”。我在网上阅读的建议说我要检查参数属性中的“允许空白值”,但这不适用于日期/时间 我在线阅读了它们,它要求我检查参数属性中的“允许空白值”,但这不适用于日期/时间。我也尝试过使用“OR IS NULL”添加许多WHERE子句的变体,但这也不起作用。我还读到我可能需要在某个地方添加一个=IIF子句,但我以前从未这样做过Sql server 如何编写WHERE子句以满足SSRS报告上的可选参数?,sql-server,datetime,parameters,where-clause,ssrs-2016,Sql Server,Datetime,Parameters,Where Clause,Ssrs 2016,我试图得到一个基本的SSRS报告,可以通过任何可选参数进行过滤。 要筛选的2个参数应介于2个日期之间或按SalesID筛选。我可以单独筛选每个参数,但当我将它们添加到语句中并尝试运行报告时,它会显示“参数不能为空”。我在网上阅读的建议说我要检查参数属性中的“允许空白值”,但这不适用于日期/时间 我在线阅读了它们,它要求我检查参数属性中的“允许空白值”,但这不适用于日期/时间。我也尝试过使用“OR IS NULL”添加许多WHERE子句的变体,但这也不起作用。我还读到我可能需要在某个地方添加一个=
Select SalesID, SalesDate, SaleValue
FROM SalesDb
WHERE (SalesDate BETWEEN @StartDate AND @EndDate AND SalesID IS NULL) OR
(SalesID = @SalesID AND @StartDate IS NULL and @EndDate IS NULL)
如果我选择了开始日期和结束日期,上面的代码就会运行,但它只遍历SalesDate数据,其他字段为空
我希望报告可以按开始日期和结束日期或SalesID进行过滤,而不是同时按两者进行过滤。目前,上面返回的错误是StartDate不能为空。如上所述,我无法检查“允许空白值”。提前感谢。约束报表生成器参数选择以强制用户指定SalesID或StartDate和EndDate对在报表生成器/SSRS中我并不熟悉,但是我可以为您指出一种SQL查询解决方案,该解决方案应能满足您的需要 首先检查参数的允许空值(这适用于日期/时间参数,与允许空值不同): 完成后,可以对参数使用
ISNULL
,将数据过滤到所需的子集:
SELECT SalesID, SalesDate, SaleValue
FROM SalesDb
WHERE SalesId = ISNULL(@SalesId, SalesId)
AND SalesDate BETWEEN ISNULL(@StartDate, SalesDate) AND ISNULL(@EndDate, SalesDate)
以SalesId=ISNULL(@SalesId,SalesId)
谓词为例,这告诉SQL Server返回行的SalesId
为以下任一行:
@SalesId
为空时,所有行都会返回,以满足要应用的@StartDate
和@EndDate
指定的限制(如果有)
这是我使用的测试线束,可能对您或其他人有用
CREATE TABLE SalesDb
(
SalesID INT NOT NULL,
SalesDate DATETIME NOT NULL,
SaleValue DECIMAL(10, 2),
)
GO
INSERT
INTO SalesDb
(
SalesID, SalesDate, SaleValue
)
VALUES (15, '2019-01-01', 12),
(16, '2019-01-02', 34),
(16, '2019-01-03', 56),
(16, '2019-01-04', 78)
DECLARE @StartDate DATETIME = '2019-01-03', @EndDate DATETIME = '2019-01-04', @SalesID INT = NULL
SELECT SalesID, SalesDate, SaleValue
FROM SalesDb
WHERE SalesId = ISNULL(@SalesId, SalesId)
AND SalesDate BETWEEN ISNULL(@StartDate, SalesDate) AND ISNULL(@EndDate, SalesDate)
您可以将数据类型更改为字符串,并添加验证(或默认值)以在为空时进行检查。但这有副作用。请检查这个线程,我会给这个尝试和反馈很快,谢谢大家。