传递多个值 ssrs sql

Passing muliple values 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

这里是员工table。

Employee 
Name Absent 
Dan    Y
Laura  N
Ross   N
James  Y

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

当我通过@absent Y 和 N 时,这在 SSRS 中对我来说工作正常。但是,当我转换为存储过程并在 SSRS 中 运行 时,我现在遇到了问题。我不再得到任何结果。

ALTER PROCEDURE usp_GetEmployees
@Absent nvarchar(20)

    SELECT * 
    FROM Employee
    WHERE Absent in @Absent

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

非常感谢任何帮助:)

您的原始代码不能直接在 SQL 中运行。您可以使用括号修复它:

 WHERE Absent in (@Absent)

这完全等同于:

WHERE Absent = @Absent

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

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

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

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

假设您的问题有错字并且您打算写

SELECT * 
FROM Employee
WHERE Absent in (@Absent)

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

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

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

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

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

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

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

对于像这样简单的事情,事实上,您最好将以下语句放入 SSRS 的数据集中:

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

如果没有,并且您需要使用存储过程,则 SSRS 会传递一个分隔字符串作为参数。在这种情况下,您需要使用分离器。考虑到您标记了 BIDS (),那么您需要使用一种非常古老的方法来执行此操作。我还强烈建议您尽快查看升级路径。

对于 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;