在SSRS上将nvarchar值转换为数据类型int时,SQL转换失败

时间:2018-02-20 18:10:32

标签: sql-server reporting-services type-conversion ssrs-2008 reportbuilder3.0

我有以下查询

SELECT * FROM A
WHERE Id IN (@Input)

其中@Input是来自SSRS的多值参数,Id是数据库中的整数。

当我尝试使用单个值运行它时,它可以工作;但是当我尝试使用2个值时,例如' 123,124',它总是会抛出标题中提到的错误。

我尝试了一系列不同的解决方案,这些解决方案出现在Google上,但它们都没有工作,或者它只返回一个空结果(当我将Id转换为varchar时)

如何使用多值参数?

2 个答案:

答案 0 :(得分:1)

好吧,在将参数值传递给数据集时,首先需要将输入参数值转换为CSV值列表。

例如,如果您的参数如下:

enter image description here

使用以下属性:

enter image description here

您应该使用JOIN函数在数据集中使用它。

e.g:

=JOIN(Parameters!input.Value,",")

应该看起来像:

enter image description here

现在,您的数据集将以@input

的形式查看/接收'123,456,789'

现在,您可以使用任何拆分功能拆分值,并可以在SQL中使用它们。

如果没有可用的拆分功能,您可以使用任何自定义SQL(下面给出的示例)将多个值更改为单值表:

e.g:

DECLARE @input VARCHAR(MAX) = '123,456,789'
IF OBJECT_ID('TEMPDB..#Multi') IS NOT NULL DROP TABLE #Multi;
CREATE TABLE #Multi (value  INT);
DECLARE @Insert VARCHAR(MAX) = 'INSERT INTO #Multi VALUES ('''+REPLACE(@input,',','''),(''')+''');';
EXEC (@Insert);
SELECT value FROM #Multi

将返回以下输出:

enter image description here

你最终的SQL应该是上面给出的SQL块,并且:

SELECT * FROM A
WHERE Id IN (SELECT value FROM #Multi)

OR

SELECT * FROM A
JOIN #Multi M ON A.Id=M.value

希望得到这个帮助。

答案 1 :(得分:0)

当选择多个选项时,SSRS将多值参数作为字符串传递。您可以通过运行SELECT @Input来验证这一点。它应该看到' 123,124'。要将这些传递给您的查询,我会将它们拆分,将它们作为整数投射,然后在查询中运行它们。有点像:

DECLARE @ssrs_input NVARCHAR(MAX) = @input
DECLARE @input_tbl TABLE (
  input INT
  )

WHILE CHARINDEX(',',@ssrs_input) > 0
BEGIN
  INSERT @input_tbl 
    SELECT CAST(SUBSTRING(@ssrs_input,0,CHARINDEX(',',@ssrs_input)) AS INT)
  SET @ssrs_input = SUBSTRING(@ssrs_input,CHARINDEX(',',@ssrs_input)+1,LEN(@ssrs_input))
END

INSERT @input_tbl 
    SELECT CAST(@ssrs_input AS INT)

SELECT *
FROM A
JOIN @input_tbl ON
    a.Id = @input_tbl.input

警告,当您的输入数量变大时,成本会增加。如果您计划选择全部选项,可能需要探索其他途径。