传递多个值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以及两者之间进行过滤。

当我同时传递@和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)不起作用。如果直接在SSRS数据集的定义中输入SQL,则该查询类型 only 有效。然后,SSRS将替换@Variable的值,并(显然)将这些值安全地注入定界和带引号的列表中。

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

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

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

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

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;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...