我有以下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;