【问题标题】:SSRS 2008 R2 - all parameters multi value AND optionalSSRS 2008 R2 - 所有参数多值和可选
【发布时间】:2018-02-23 22:23:23
【问题描述】:

我有一份包含 6 个参数的报告。所有参数都必须是可选的,并且 3 必须是多值的。可选参数之一是下拉菜单,其余参数在文本框中手动键入。 当有多个 @VendorNum 值和一个 @FullJA 值时,下面的 Where 子句有效,但无论 @VendorNum 计数如何,都会因多个 @FullJA 值而失败。

参数: @VendorNum - 由用户手动键入(空格分隔) - 可选,可以是多值 @FullJA - 由用户手动键入(空格分隔) - 可选,可以是多值 @BU - 可选,可以是多值 - 当@JA 被填充时,它会自动填充,如果@JA 没有被填充,它是一个全部被选中的下拉列表。 @JA3 - 由用户键入 - 可选,单值 @StartDate 和 @EndDate - 可选的单个值

    select * from some_table
    WHERE
    /*FULL JA*/
    (
        SUBSTRING(VendorNum, PATINDEX('%[^0]%', VendorNum    + '.'), LEN(VendorNum)
        ) IN (@VendorNum)
        AND LEFT(JA, 7) IN (@FullJA)
        AND BU IN(@BU)
        AND @JA3 IS NULL
        )
OR
    /*DATE RANGE*/
    (
        SUBSTRING(VendorNum, PATINDEX('%[^0]%', VendorNum + '.'), LEN(VendorNum)
        ) IN (@VendorNum)
        AND LEN(ISNULL(CONVERT(VARCHAR(20), Cleared_When), '0')) >= @ClearedOnly
        AND ad.Audit_Publish_Date >= ISNULL(@StartDate, '2015-01-01')
        AND ad.Audit_Publish_Date <= ISNULL(@EndDate, '2025-12-31')
        AND BU IN (@BU)
        AND @FullJA IS NULL
        AND @JA3 IS NULL
        )

    /*BUS UNIT AND JA3*/
    OR (
        SUBSTRING(VendorNum, PATINDEX('%[^0]%', VendorNum + '.'), LEN(VendorNum)
        ) IN (@VendorNum)
        AND BU IN (@BU)
        AND ad.Audit_Publish_Date >= ISNULL(@StartDate, '2015-01-01')
        AND ad.Audit_Publish_Date <= ISNULL(@EndDate, '2025-12-31')
        AND LEFT(JA, 3) = (@JA3)
        AND @FullJA IS NULL
        )
    /*BUS UNIT ONLY*/
    OR (
        SUBSTRING(VendorNum, PATINDEX('%[^0]%', VendorNum + '.'), LEN(VendorNum)
        ) IN (@VendorNum)
        AND BU IN (@BU)
        AND ad.Audit_Publish_Date >= ISNULL(@StartDate, '2015-01-01')
        AND ad.Audit_Publish_Date <= ISNULL(@EndDate, '2025-12-31')
        AND @JA3 IS NULL
        AND @FullJA IS NULL
        )

@FullJA 和 @VendorNum 的数据集参数值都是 =IIF(InStr(Parameters!FullJA.Value," ")>0,SPLIT(Parameters!FullJA.Value," "),Parameters!FullJA.Value) 并且所有参数都设置为非多值,允许为空。

任何帮助将不胜感激。我已经为这个项目写了 200 多份报告,而这是唯一一份真正让我着迷的报告!

谢谢!

【问题讨论】:

  • 我最终为这些值创建了一个表,并按照您的指示填充了它们。我将它们全部存储在一个表中,然后在存储过程中使用别名从每一列中获取正确的值。

标签: reporting-services ssrs-2008 ssrs-2008-r2 optional-parameters


【解决方案1】:

我会通过建立一些临时表/表变量来解决这个问题,以保存潜在的多值变量,然后加入这些表。这样做的好处是您可以插入所有可能的值,以防它们省略了变量。因此,如果给定变量,您将拆分字符串并将它们放入这些表中(类似于this example),否则只需执行insert into 来填充您的临时表/表变量。

对于拆分功能,我更喜欢这样的:

create FUNCTION [dbo].[Split] (@sep VARCHAR(32), @s VARCHAR(MAX))
RETURNS TABLE
AS
    RETURN
    (
        SELECT r.value('.','VARCHAR(MAX)') as Item
        FROM (SELECT CONVERT(XML, N'<root><r>' + REPLACE(REPLACE(REPLACE(@s,'& ','&amp; '),'<','&lt;'), @sep, '</r><r>') + '</r></root>') as valxml) x
        CROSS APPLY x.valxml.nodes('//root/r') AS RECORDS(r)
    )
GO
GRANT SELECT
    ON OBJECT::[dbo].[Split] TO PUBLIC
    AS [dbo];

然后我会使用类似这样的方式将这些变量放入表中(我的分隔符是“,”):

select ltrim(rtrim(ppl.Item)) as PersonName
into #gppl
from dbo.Split(', ', @PersonListForCompare) as ppl

你会做更多类似的事情:

select ltrim(rtrim(vnd.Item)) as VendorNum
into #vendorNums
from dbo.Split(', ', @VendorNum) as vnd

然后,您可以像任何其他表一样加入该临时表,并使用它来限制您的结果。在你的情况下,如果他们没有给你任何输入,你想加入所有供应商(可能)。所以,你会做这样的事情:

create table #vendorNums (VendorName varchar(64))   --I have no idea, here, what this data looks like

if @VendorNum is not null and datalength(@VendorNum) > 0
    insert into into #vendorNums (VendorNum)
    select ltrim(rtrim(vnd.Item))
    from dbo.Split(', ', @VendorNum) as vnd
else
    insert into into #vendorNums (VendorNum)
    select VendorNum
    from dbo.Vendors

也就是说,我认为您可以将select from dbo.Split 直接用作联接中的表,而不是将其放入临时表中。唯一的问题是您必须确保其中有数据 to 拆分,否则您将有一堆组合来获得空参数与空参数的正确匹配。填充的。

【讨论】:

  • 非常感谢您的回复...我对存储过程和临时表没有太多经验。没有它们是否可以创建这种报告?我在其他报告中使用了拆分功能,但是当我尝试使用此报告时,查询将在 SSMS 中运行,但 SSRS 会因“udf.split 函数有太多参数”而出错。这就是我最终在数据集参数中使用 split 函数的方式。
  • @tardytrtl 刚刚编辑过 - 再看看是否更清晰。
  • 这样就清楚多了;感谢您提供更多详细信息。我会试试看。
  • @tardytrtl 让每个人都知道你是如何解决它的,无论我的解决方案是否有帮助,以便在一段时间内帮助其他人。 :)
  • 我最终为这些值创建了一个表,并按照您的指示填充了它们。我将它们全部存储在一个表中,然后在存储过程中使用别名从每一列中获取正确的值。
猜你喜欢
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多