为什么在SSRS中传递多个整数值参数会引发转换错误?

时间:2017-02-07 19:04:55

标签: sql-server reporting-services parameters int

我的程序就是这样,很简单。

ALTER PROCEDURE dbo.MyProcedure
    @NoteStoreType INT 
AS 
    SELECT 
        Column1, Column2, Column3  
    FROM  
        tblNoteStore
    WHERE 
        tblNoteStore.Type IN (COALESCE(@NoteStoreType, tblNoteStore.Type)) 

我的数据集用于填充可用的参数值:

SELECT DISTINCT 
    tblNoteStore.Type, 
    lstNoteTypes.Description
FROM
    tblNoteStore 
INNER JOIN
    lstNoteTypes ON tblNoteStore.Type = lstNoteTypes.NoteTypeID
ORDER BY    
    lstNoteTypes.Description

返回此结果:

enter image description here

然后我转到报告参数属性以允许多个值:

enter image description here

现在设置可用值:

enter image description here

然后,如果我使用多个值运行报告,则会给出错误:

enter image description here

我知道这是因为SSRS将多个值视为字符串,并用逗号传递它们。

但在这种情况下会有什么工作?

2 个答案:

答案 0 :(得分:1)

存储过程中的参数@NoteStoreType INT是单个INTEGER,而不是整数值列表。您应该尝试使用动态查询:

CREATE PROCEDURE dbo.MyProcedure
@NoteStoreType NVARCHAR(2048) 
AS
BEGIN

  DECLARE @cmd NVARCHAR(MAX)

  SET @cmd = 'SELECT Column1, Column2, Column3 
              FROM  tblNoteStore
              WHERE tblNoteStore.Type IN (' + @NoteStoreType + ')';

  EXEC (@cmd);

END
GO

在此处查看:http://rextester.com/NWLLU92997

答案 1 :(得分:1)

我尽量避免使用动态SQL,因为它很难维护。您可以将此参数作为SQL中的过滤器应用,也可以在查询运行后在数据集级别应用它。

添加数据集过滤器非常简单。唯一的缺点是效率较低。如果速度差异微不足道,那么这是一个不错的选择。 enter image description here

在某些版本的SSRS中,您可以在SQL中使用常规IN语句:

WHERE tblNoteStore.Type IN (@NoteStoreType) 

如果这不适用于您的版本,您还可以在SQL中使用自定义拆分功能将逗号分隔的字符串分解为单个值。已经有很多专门针对该特定主题的答案。