【问题标题】:SQL conversion failed when converting nvarchar value to data type int on SSRS在 SSRS 上将 nvarchar 值转换为数据类型 int 时 SQL 转换失败
【发布时间】:2018-02-20 18:10:32
【问题描述】:

我有以下查询

SELECT * FROM A
WHERE Id IN (@Input)

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

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

我尝试了谷歌上出现的一堆不同的解决方案,但它们都不起作用,或者它只是返回一个空结果(当我将 Id 转换为 varchar 时)

如何使它与多值参数一起使用?

【问题讨论】:

  • 只要您直接在数据集中查询而不是存储过程,上述内容应该就是您所需要的。无需进行任何类型的 JOIN/SPLIT 等操作。此外,将 SSRS 参数保留为文本(即使它是整数)
  • 您的参数的 DATA TYPE 是否设置为 Text 而不是 Integer
  • 它是文本,它返回那个错误。我相信这是因为 Id 的数据类型是 Integer。

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


【解决方案1】:

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

例如,如果你的参数是这样的:

具有如下属性:

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

例如:

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

应该是这样的:

现在,您的数据集将以'123,456,789' 的形式查看/接收@input

而且,现在您可以使用任何拆分函数来拆分值,并可以在您的SQL 中使用它们。

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

例如:

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

将返回以下输出:

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

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

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

希望对您有所帮助。

【讨论】:

  • 我缺少的是用于拆分字符串的自定义 SQL 代码。我认为有一种更简单的方法可以做到这一点,但显然不是。谢谢。
【解决方案2】:

选择多个选项时,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

警告,当您的输入数量变大时,成本会增加。如果您打算通过全选有很多选项,则可能需要探索其他途径。

【讨论】:

  • 此查询的潜在输入可能超过 14000,因此这可能是个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2011-08-29
  • 2015-06-20
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多