Sql server 如何编写WHERE子句以满足SSRS报告上的可选参数?

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子句的变体,但这也不起作用。我还读到我可能需要在某个地方添加一个=

我试图得到一个基本的SSRS报告,可以通过任何可选参数进行过滤。 要筛选的2个参数应介于2个日期之间或按SalesID筛选。我可以单独筛选每个参数,但当我将它们添加到语句中并尝试运行报告时,它会显示“参数不能为空”。我在网上阅读的建议说我要检查参数属性中的“允许空白值”,但这不适用于日期/时间

我在线阅读了它们,它要求我检查参数属性中的“允许空白值”,但这不适用于日期/时间。我也尝试过使用“OR IS NULL”添加许多WHERE子句的变体,但这也不起作用。我还读到我可能需要在某个地方添加一个=IIF子句,但我以前从未这样做过

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参数不为null,则等于该参数,或者
  • 如果@SalesId为null,则等于行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)
    

    您可以将数据类型更改为字符串,并添加验证(或默认值)以在为空时进行检查。但这有副作用。请检查这个线程,我会给这个尝试和反馈很快,谢谢大家。