【问题标题】:Passing muliple values ssrs sql传递多个值ssrs sql
【发布时间】:2021-01-09 15:05:34
【问题描述】:

我有以下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 以及两者之间进行过滤。

当我通过@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 sql-server reporting-services visual-studio-2008


    【解决方案1】:

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

     WHERE Absent in (@Absent)
    

    这完全等同于:

    WHERE Absent = @Absent
    

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

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

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

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

    【讨论】:

    • 谢谢你,WHERE ',' + @Absent + ',' LIKE '%,' + Absent + ',%' 为我工作:))
    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

      对于 SSRS,如果使用存储过程,格式 Column IN (@Variable) 不起作用。如果 SQL 直接在 SSRS 数据集的定义中,则这种类型的查询有效。然后 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 2021-02-09
        • 1970-01-01
        相关资源
        最近更新 更多