如何使用参数在表中传递多个值?

问题描述 投票:0回答:1

我制作了 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
reporting-services ssrs-2008 ssrs-2012 ssrs-tablix sqlreportingservice
1个回答
0
投票

我在这里做了一些假设..

  1. 您可以将报表连接到 SQL Server,因为大部分工作将在那里完成

  2. 由于它看起来(基于标签)是旧版本的 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
(区分大小写)。

对其他两个参数重复此操作。

现在您只需在报告中添加一个指向这个新数据集的表格即可。

应该是这样。

© www.soinside.com 2019 - 2024. All rights reserved.