Reporting services 2008年SSRS的表值参数

Reporting services 2008年SSRS的表值参数,reporting-services,ssrs-2008,table-valued-parameters,Reporting Services,Ssrs 2008,Table Valued Parameters,我们需要生成SSRS报告,从中我们需要将多值字符串和整数参数转换为datatable并将其传递给存储过程。存储过程包含多个表类型参数。之前我们使用了varchar(8000),但它也超过了数据类型限制。然后我们考虑引入数据表的概念。但我们不知道如何从SSR传递值 我们从GruffCode上找到了一个解决方案 解决方案解决了我的问题,我们能够生成报告。但是,有时SSRS会返回以下两个错误: 报告处理过程中发生错误。 数据集“DSOutput”的查询执行失败。 字符串或二进制数据将被截断。声明已终止

我们需要生成SSRS报告,从中我们需要将多值字符串和整数参数转换为datatable并将其传递给存储过程。存储过程包含多个表类型参数。之前我们使用了
varchar(8000)
,但它也超过了数据类型限制。然后我们考虑引入数据表的概念。但我们不知道如何从SSR传递值

我们从GruffCode上找到了一个解决方案

解决方案解决了我的问题,我们能够生成报告。但是,有时SSRS会返回以下两个错误:

报告处理过程中发生错误。
数据集“DSOutput”的查询执行失败。
字符串或二进制数据将被截断。声明已终止

报表处理中出现意外错误。
引发了“System.OutOfMemoryException”类型的异常


我不确定它是何时何地导致问题的。

该博客文章中概述的方法依赖于在内存中构建一个巨大的字符串,以便将所有选定的参数值加载到表值参数实例中。如果选择大量值传递到查询中,我可以看到它在尝试构建包含将加载参数的insert语句的字符串时可能导致“System.OutOfMemoryException”

至于“字符串或二进制数据将被截断”错误,该错误听起来像是源于报表用于收集数据的查询或存储过程。在没有看到t-sql的样子的情况下,我无法解释为什么会发生这种情况,但我猜它也与选择大量参数值有关

不幸的是,我不确定是否有解决方法,除了尝试看看是否可以找到一种方法来选择更少的参数值。以下是一些粗略的想法:

  • 如果用户可能会选择少量参数值或所有参数值,那么您可以让查询只取一个非常简单的布尔值,指示所有值都已选择,而不是让报表通过参数发送所有值
  • 你也可以考虑一下参数值的“缩小”,并将它们组合在一起。这样,用户就可以从数量较少的参数值中进行选择,这些参数值表示一组全部汇总的单个值
    我不喜欢在SQL语句中使用文本参数和EXEC,就像您引用的文章所描述的那样,因为这样做需要SQL注入。将查询发送到SQL server时,带有多值参数的默认SSRS行为将直接替换以逗号分隔的值列表来代替参数。这对于简单IN查询非常有效,但在其他地方可能不受欢迎。通过将数据集上的参数值设置为
    =Join(Parameters!CustomerIDs.Value,“,”)
    的表达式,可以绕过此行为。完成此操作后,可以使用以下SQL加载表变量:

    DECLARE@CustomerIDsTable表(CustomerID int非空主键)
    插入@CustomerIDsTable(CustomerID)
    选择不同的TextNodes.Node.value(N'.'和N'int')作为CustomerID
    从(
    选择CONVERT(XML,N''+合并(N''+替换(@CustomerIDs,N','',N'')+N'','')+N''作为pNode
    )作为xmlDocs
    交叉应用pNode.nodes(N'/A/e')作为文本节点(Node)
    --对结果表变量执行任何操作,即。,
    EXEC rpt_CustomerTransactionSummary@StartDate、@EndDate、@CustomerIDsTable
    
    如果使用文本而不是整数,则会有几行更改如下:

    DECLARE@CustomerIDsTable表(CustomerID nvarchar(MAX)非空主键)
    插入@CustomerIDsTable(CustomerID)
    选择不同的TextNodes.Node.value(N'.'和N'nvarchar(MAX')作为CustomerID
    从(
    选择CONVERT(XML,N''+合并(N''+替换(@CustomerIDs,N','',N'')+N'','')+N''作为pNode
    )作为xmlDocs
    交叉应用pNode.nodes(N'/A/e')作为文本节点(Node)
    --对结果表变量执行任何操作,即。,
    EXEC rpt_CustomerTransactionSummary@StartDate、@EndDate、@CustomerIDsTable
    


    这种方法也适用于处理用户输入的逗号分隔项字符串。

    第一个错误通常是由于类型/长度不匹配造成的。将数据库的数据类型/长度与期望值进行比较。