SSRS 2008报告不使用存储过程

时间:2016-04-02 21:24:15

标签: sql-server reporting-services ssrs-2008 ssrs-2008-r2 ssrs-tablix

在新的SSRS 2008报告中,我将内联SQL更改为已存储 程序,因为这是我正在进行的项目的要求。 SQL在SSRS 2008报告中正常工作,但在存储过程中存在问题。

显示的错误消息如下:

  

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

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

SSRS 2008报告在主Tablix中有18个嵌入式Tablix。该 SSRS主Tablix中的嵌入式Tablix将根据用户的报告参数显示所选报告。将根据报告编号显示嵌入式报告。另外,我只希望从SQL返回所选报告的数据。

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

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

  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)  

我尝试将report参数的属性更改为整数和 如果上面列出的陈述,但它没有奏效。

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

1 个答案:

答案 0 :(得分:1)

听起来您从下拉列表中传入值,允许最终用户选择多个值。如果是这种情况,则SSRS将这些值发送到一个长字符串中的存储过程。下拉列表中检查的值越多,字符串越长。如果最终用户只检查一个值,那么在这种情况下一切都会起作用(你的IN子句只能处理一个值)。

您有2个选项。选项1.使SSRS下拉列表成为单个值下拉列表。

如果这不是一个可行的选择,那么这里是选项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以在您的情况下使用整数,但隐式转换数据类型可能不是问题。或者,将SSRS下拉列表中的数据类型更改为字符串。