我制作了 3 个参数名称 Invno1 、 Date1 、 Amount1 并将其传递到下表中,如下所示:-
Invno | 日期 | 金额 |
---|---|---|
< Expr > | < Expr > | < Expr > |
=参数!InvNo1.Value(0) , =参数!Date1.Value(0) ,=参数!Amount1.Value(0)
在 invno1 参数中,我传递多个值,例如 = 1 , 2
在 Date1 参数中,我传递多个值,例如 = 3 , 4
在 Amount1 参数中,我传递多个值,例如 - 5 , 6
但只有表中的第一个数据字段,如下图所示 SSRS 屏幕截图 ,我想要这个数据作为
Invno | 日期 | 金额 |
---|---|---|
1 | 3 | 5 |
2 | 4 | 6 |
我在这里做了一些假设..
您可以将报表连接到 SQL Server,因为大部分工作将在那里完成
由于它看起来(基于标签)是旧版本的 SQL Server,因此您无法使用新版本附带的 string_split 函数,因此我包含了创建此函数的代码。如果您已经有一个功能,请使用它。
基本思想是将参数值传递给 SQL Server 上的存储过程,这将调用表值函数将每个参数放入表中。然后,我们将连接这些表(每个参数一个)以返回所需的结果。
第 1 步:创建 TVF。如果您已经有一个函数可以执行此操作,或者您正在使用新版本的 SQL Server,那么您可以使用 string_split 函数。
CREATE FUNCTION dbo.SplitString (@CSV VARCHAR(8000), @Delim varchar(10))
RETURNS TABLE
AS
RETURN
(
WITH Numbers AS -- builds a table of integers from 1 to 2048 to use as row numbers
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Position
FROM master.dbo.spt_values
WHERE type = 'P'
AND number < ISNULL(DATALENGTH(@CSV),0)
),
Splits AS -- split the string by delim and join to the numbers CTE
(
SELECT
ROW_NUMBER() OVER (ORDER BY Position) AS Position,
LTRIM(RTRIM(SUBSTRING(@CSV, Position,
CHARINDEX(@Delim, @CSV + @Delim, Position) - Position))) AS CSValue
FROM Numbers n
WHERE SUBSTRING(@Delim + @CSV, Position, 1) = @Delim
)
-- finally, select the results of the Splits CTE trimming CSValue
SELECT
Position,
LTRIM(RTRIM(CSValue)) as CSValue
FROM Splits
WHERE CSValue <> ''
)
如果我们运行以下语句
SELECT * FROM dbo.SplitString('A1 , B2,Z3,Y4', ',')
我们得到这些结果
位置 | CS价值 |
---|---|
1 | A1 |
2 | B2 |
3 | Z3 |
4 | Y4 |
第2步:创建一个过程来返回结果
CREATE PROC dbo.ParamsToTable(@InvNo varchar(8000), @Dates varchar(8000), @Amounts varchar(8000)) AS
DECLARE @Delim varchar(10) = ','
SELECT
i.CSValue as InvNo,
d.CSValue as [Date],
a.CSValue as Amount
FROM dbo.SplitString(@InvNo, @Delim) i
JOIN dbo.SplitString(@Dates, @Delim) d on i.[Position] = d.[Position]
JOIN dbo.SplitString(@Amounts, @Delim) a on i.[Position] = a.[Position]
ORDER BY a.[Position]
此过程采用 3 个参数作为简单的 CSV 字符串,将每个参数传递给我们之前创建的 TBF 并连接结果。
所以如果我们这样做
EXECUTE dbo.ParamsToTable '1,2', '3,4', '5,6'
我们得到了这些结果。
库存号 | 日期 | 金额 |
---|---|---|
1 | 3 | 5 |
2 | 4 | 6 |
现在我们要做的就是将参数从 SSRS 传递给 SP。
第 3 步:从 SSRS 呼叫 SP
在您的报告中,添加调用上面 SP 的数据集。对于这 3 个参数中的每一个,我们需要将各个值连接成一个字符串
为此,请将每个参数值设置为
=JOIN(Parameters!InvNo.Value, ",")
这假设您的发票编号参数在报告设计中称为
InvNo
(区分大小写)。
对其他两个参数重复此操作。
现在您只需在报告中添加一个指向这个新数据集的表格即可。
应该是这样。