SSRS 2008 R2 - 所有参数多值且可选

SSRS 2008 R2 - all parameters multi value AND optional

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

参数: @VendorNum - 由用户手动键入(space 分隔)- 可选,可以是多值 @FullJA - 由用户手动键入(space 分隔)- 可选,可以是多值 @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 多份报告,这是唯一一份真正让我精疲力竭的报告!

谢谢!

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

对于拆分函数,我更喜欢这样:

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];

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

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

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

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 直接用作联接中的 table,而不是将其放入临时 table。唯一的问题是你必须确保你有数据 拆分,否则你将有一堆组合来获得正确的 match-up空参数与填充参数。