SQL 在 SSRS 上将 nvarchar 值转换为数据类型 int 时转换失败
SQL conversion failed when converting nvarchar value to data type int on SSRS
我有以下查询
SELECT * FROM A
WHERE Id IN (@Input)
其中 @Input 是来自 SSRS 的 multi-value 参数,Id 是数据库中的整数。
当我尝试使用单个值 运行 它时,它起作用了;但是当我尝试使用 2 个值时,例如'123,124',它总是抛出标题中提到的错误。
我尝试了一堆出现在 Google 上的不同解决方案,但其中 none 完全有效,或者只是 returns 一个空结果(当我使用 Id到 varchar)
如何让它与 multi-value 参数一起工作?
SSRS 在 selected 多个选项时将多值参数作为字符串传递。您可以通过 运行ning 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
警告一句,当您的输入数量变大时,此成本会增加。如果您计划有很多选择 select all,您可能想探索其他途径。
嗯,将参数值传递给数据集时,首先需要将输入参数值转换为 CSV 值列表。
例如,如果您的参数如下:
具有以下属性:
您应该使用 JOIN 函数在您的数据集中使用它。
例如:
=JOIN(Parameters!input.Value,",")
它应该看起来像:
现在,您的数据集将 view/receive @input
为 '123,456,789'
而且,现在您可以使用任何拆分函数来拆分值,并可以在您的 SQL
.
中使用它们
如果没有可用的拆分功能,您可以使用任何自定义 SQL(下面给出的示例)将多个值更改为 single-valued table:
例如:
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
将return输出如下:
而你最终的 SQL 应该是上面给出的 SQL 块并且:
SELECT * FROM A
WHERE Id IN (SELECT value FROM #Multi)
或
SELECT * FROM A
JOIN #Multi M ON A.Id=M.value
希望对您有所帮助。
我有以下查询
SELECT * FROM A
WHERE Id IN (@Input)
其中 @Input 是来自 SSRS 的 multi-value 参数,Id 是数据库中的整数。
当我尝试使用单个值 运行 它时,它起作用了;但是当我尝试使用 2 个值时,例如'123,124',它总是抛出标题中提到的错误。
我尝试了一堆出现在 Google 上的不同解决方案,但其中 none 完全有效,或者只是 returns 一个空结果(当我使用 Id到 varchar)
如何让它与 multi-value 参数一起工作?
SSRS 在 selected 多个选项时将多值参数作为字符串传递。您可以通过 运行ning 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
警告一句,当您的输入数量变大时,此成本会增加。如果您计划有很多选择 select all,您可能想探索其他途径。
嗯,将参数值传递给数据集时,首先需要将输入参数值转换为 CSV 值列表。
例如,如果您的参数如下:
具有以下属性:
您应该使用 JOIN 函数在您的数据集中使用它。
例如:
=JOIN(Parameters!input.Value,",")
它应该看起来像:
现在,您的数据集将 view/receive @input
为 '123,456,789'
而且,现在您可以使用任何拆分函数来拆分值,并可以在您的 SQL
.
如果没有可用的拆分功能,您可以使用任何自定义 SQL(下面给出的示例)将多个值更改为 single-valued table:
例如:
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
将return输出如下:
而你最终的 SQL 应该是上面给出的 SQL 块并且:
SELECT * FROM A
WHERE Id IN (SELECT value FROM #Multi)
或
SELECT * FROM A
JOIN #Multi M ON A.Id=M.value
希望对您有所帮助。