我有以下查询
SELECT * FROM A
WHERE Id IN (@Input)
其中@Input是来自SSRS的多值参数,Id是数据库中的整数。
当我尝试使用单个值运行它时,它可以工作;但是当我尝试使用2个值时,例如' 123,124',它总是会抛出标题中提到的错误。
我尝试了一系列不同的解决方案,这些解决方案出现在Google上,但它们都没有工作,或者它只返回一个空结果(当我将Id转换为varchar时)
如何使用多值参数?
答案 0 :(得分:1)
好吧,在将参数值传递给数据集时,首先需要将输入参数值转换为CSV值列表。
例如,如果您的参数如下:
使用以下属性:
您应该使用JOIN函数在数据集中使用它。
e.g:
=JOIN(Parameters!input.Value,",")
应该看起来像:
现在,您的数据集将以@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
将返回以下输出:
你最终的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
警告,当您的输入数量变大时,成本会增加。如果您计划选择全部选项,可能需要探索其他途径。