传递多个值ssrs-sql



我有以下sql:

--DECLARE @absent nvarchar(20)
--SET @absent = 'Y' -- Not needed in sql as we are setting this in ssrs
SELECT * 
FROM Employee
WHERE Absent in @Absent

这是员工表。

Employee 
Name Absent 
Dan    Y
Laura  N
Ross   N
James  Y

我希望能够在Y和N之间以及两者之间进行筛选。

当我同时传递@absence Y和N时,这在SSRS中对我来说很好。然而,当我转换到存储过程并在SSRS运行时,我现在遇到了一个问题。我再也得不到任何结果了。

ALTER PROCEDURE usp_GetEmployees
@Absent nvarchar(20)
SELECT * 
FROM Employee
WHERE Absent in @Absent

我尝试过参数属性中的=join(parameters!Absent.value,",")行,但没有成功。我相信问题出在传入的数据类型上。奇怪的是,在我转换为usp之前,它就可以工作了。

非常感谢您的帮助:(

假设你的问题中有一个拼写错误,你打算写

SELECT * 
FROM Employee
WHERE Absent in (@Absent)

当直接在数据集查询中使用时,这将起作用的原因是SSRS将采用多值参数的选定选项,将它们转换为逗号分隔的列表,并将它们注入SQL。因此,实际执行的将是,例如,

SELECT * 
FROM Employee
WHERE Absent in ('Y', 'N')

调用存储过程时,此过程不同,因为SSRS无法更改SP中的代码。

将多值参数传递给存储过程时,通常会传递一个表达式,如=JOIN(Parameters!myParam.Value, ",")。这会传入一个字符串,该字符串包含所选参数值的逗号分隔列表。

在存储过程中,您通常会调用一个函数,将此字符串拆分回一个可以加入的表。

有很多文章描述了这一点,并提供了一个可用的split函数,以防您没有。点击此处查看答案https://social.msdn.microsoft.com/Forums/sqlserver/en-US/0ead7ceb-3fdd-4625-aa82-1d4195f984b1/passing-multivalue-parameter-in-stored-procedure-ssrs?forum=sqlreportingservices

您的原始代码无法直接在SQL中工作。你可以使用括号修复它:

WHERE Absent in (@Absent)

这完全等同于:

WHERE Absent = @Absent

这可能不是你想要的。在SQL Server的最新版本中,您可以使用:

WHERE Absent IN (SELECT value FROM string_split(@Absent, ','))

','是我对您使用的分隔符的猜测。您也可以使用:

WHERE ',' + @Absent + ',' LIKE '%,' + Absent + ',%'

对于SSRS,如果使用存储过程,格式Column IN (@Variable)将不起作用。如果SQL直接在SSRS数据集的定义中,则只有才能使用这种类型的查询。然后,SSRS将替换@Variable的值,并(显然(将这些值安全地注入一个带分隔符和引号的列表中。

对于这样简单的事情,事实上,你最好只在SSRS的数据集中放以下语句:

SELECT * 
FROM Employee
WHERE Absent in (@Absent);

如果不是,并且需要使用存储过程,则SSRS会传递一个分隔字符串作为参数。在这种情况下,您需要使用拆分器。考虑到你标记了BIDS(visual-studio-2008(,那么你需要使用一种非常古老的方式来做这件事。我还强烈建议您尽快查看升级路径。

对于2008年,我建议使用delimitedsplit8K(如果使用nvarchar,则推荐使用delimitedsplitN4K(。然后您的程序将如下所示:

ALTER PROCEDURE usp_GetEmployees @Absent nvarchar(4000) AS
BEGIN
SELECT E.* --YOu should replace this with your actual columns
FROM Employee E
JOIN dbo.delimitedsplitN4K(@Absent,',') DS ON E.Absent = DS.item;
END;

相关内容

  • 没有找到相关文章

最新更新