s-s-rS 2008 报告无法使用存储过程

Posted

技术标签:

【中文标题】s-s-rS 2008 报告无法使用存储过程【英文标题】:s-s-rS 2008 report not working with using a stored procedure 【发布时间】:2016-04-02 21:24:15 【问题描述】:

在新的 s-s-rS 2008 报告中,我将内联 SQL 更改为存储 程序,因为这是我正在从事的项目的要求。 SQL 在 s-s-rS 2008 报告中运行良好,但在存储过程中存在问题。

显示的错误信息如下:

数据集 Msg 8114 的查询执行失败,级别 16,状态 1 过程 spRec, 第 0 行将数据类型 varchar 转换为 int 时出错。

如果我只选择 1 个报告,则存储过程有效。但是,如果我选择 2 个或更多报告,则会发生上述错误。

s-s-rS 2008 报告在主 tablix 中有 18 个嵌入式 tablix。这 s-s-rS 主 tablix 中的嵌入式 tablix 将根据用户的报告参数显示选定的报告。嵌入的报告将根据报告编号显示。此外,我只希望从 SQL 返回所选报告的数据。

我希望这种情况发生,因为运行中的数据将超过每次唯一运行所需的数据。注意:返回的数据将全部采用相同的格式。每个数据行中都会有一列显示应为哪个报告编号选择数据。

报告参数设置为允许多个值和数据类型 = 文本。 将数据传递给报表参数的数据集如下所示:

  SELECT 'Locator' AS rptName, 1 AS rptValue 
      UNION 
  SELECT 'letter',2  
      UNION 
  SELECT 'Wallet ',  3 
     UNION 
  SELECT 'Cum Stu', 4 
     UNION  
  SELECT 'Attend', 5 
    UNION 
  SELECT  'Test',6 

每个部分之前的 SQL 如下所示:

IF 1 in (@report) 


 IF 2 in (@report)  

我尝试将报告参数的属性更改为整数和 如果上面列出的语句,但它没有工作。

那么你能告诉我我能做些什么来解决我的问题吗?

【问题讨论】:

仅从查询分析器运行的过程可以正常工作吗?我不明白你如何调用该过程,以及它的内部...... 【参考方案1】:

听起来您是从允许最终用户选择多个值的下拉列表中传递值。如果是这种情况,那么 s-s-rS 会将这些值以一个长字符串形式发送到存储过程。在下拉列表中选中的值越多,字符串就越长。如果最终用户只检查一个值,那么在这种情况下一切正常(您的 IN 子句只能处理一个值)。

您有 2 个选项。选项 1. 将 s-s-rS 下拉菜单设为单值下拉菜单。

如果这不是一个可行的选项,那么这里是选项 2:

您必须将存储过程中@report 参数的数据类型设置为类似于 (n)varchar(1000);足够长的东西来处理具有所有可能值的字符串。然后,您必须将字符串拆分为单独的值,以便可以在 IN 子句中使用它们。这是我过去使用的拆分 UDF。

CREATE FUNCTION [dbo].[udf_Split] 
   (  @List      varchar(8000), 
      @Delimiter varchar(5)
   ) 
   RETURNS @TableOfValues table 
      (  RowID   smallint IDENTITY(1,1), 
         [Value] varchar(100) 
      ) 
AS 
   BEGIN

      DECLARE @LenString int 

      WHILE len( @List ) > 0 
         BEGIN 

            SELECT @LenString = 
               (CASE charindex( @Delimiter, @List ) 
                   WHEN 0 THEN len( @List ) 
                   ELSE ( charindex( @Delimiter, @List ) -1 )
                END
               ) 

            INSERT INTO @TableOfValues 
               SELECT substring( @List, 1, @LenString )

            SELECT @List = 
               (CASE ( len( @List ) - @LenString ) 
                   WHEN 0 THEN '' 
                   ELSE right( @List, len( @List ) - @LenString - 1 ) 
                END
               ) 
         END

      RETURN 

   END 

一旦你有了它,你可以改变你的代码看起来像这样。

IF 1 IN (SELECT value FROM dbo.udf_Split(@report, ','))

您可能需要调整此 UDF 以在您的情况下使用整数,但数据类型的隐式转换可能不是问题。或者,将 s-s-rS 下拉列表中的数据类型更改为字符串。

【讨论】:

以上是关于s-s-rS 2008 报告无法使用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 报表服务器无法立即看到对存储过程的更新.....如何更改?

s-s-rS 2008 报告 SQL 选项

无法连接到远程服务器 - s-s-rS 2008 - webservice

将参数从 ReportViewer 传递到 s-s-rS 报告的存储过程数据源

s-s-rS 2008 排序不工作

s-s-rS 2008 部署问题