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,'& ','& '),'<','<'), @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空参数与填充参数。
我有一份包含 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,'& ','& '),'<','<'), @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空参数与填充参数。