在 s-s-rS 中,如何使用多值参数创建动态“位置”条件

Posted

技术标签:

【中文标题】在 s-s-rS 中,如何使用多值参数创建动态“位置”条件【英文标题】:In s-s-rS, how to create a dynamic 'where' condition using multi value parameters 【发布时间】:2018-07-20 16:14:51 【问题描述】:

首先我会提到一些我的工作以更好地理解我的问题

所以,在 s-s-rS 中,我有多个参数,它们都使用 =Join(Parameter!x.value,",") 然后在过程中,我通过连接所有参数来创建 where 条件。

类似这样的:

> Set @where = 
> 'and Table.Column in(''' + replace(RTRIM(LTRIM(@Parameter1)),',', ''',''') 
> + ''')' + ' 
> and Table.Column in(''' + replace(RTRIM(LTRIM(@Parameter2)),',', ''',''')
> + ''')' + '
> and Table.Column in(''' + replace(RTRIM(LTRIM(@Parameter3)),',', ''',''') + 
> ''')' + '

我的问题是:如何在 s-s-rS 中创建这个 @where 作为数据集/参数。我想这样做,以便我可以在详细报告中使用相同的@where,该报告连接到主要摘要报告并在我单击摘要报告中的数字时传递给我的详细报告。我不想在我的详细 rdl 中再次重新创建相同的 where 条件

【问题讨论】:

澄清一下,您希望在 s-s-rS 中使用一个表达式来创建此动态 WHERE 子句的单个字符串,您可以在过程中将其附加到其他一些动态 SQL 中?我们可以这样做,但我觉得您可能会使报告过于复杂,因为很少需要动态 SQL 并且难以维护。 【参考方案1】:

正如@StevenWhite 指出的那样,您可能需要重新考虑您的方法,但如果您真的想这样做。

您需要在报告中添加一个附加参数(一旦一切正常,您可以将其隐藏)

此参数的数据集将是您现有的动态 sql 代码,但只是 WHERE 子句部分,因此数据集查询的结尾只需执行 SELECT @where 之类的操作。

因此,一旦填充了其他参数,就会填充这个新参数,并且它的值将是您的 where 子句。然后,您可以将其作为参数传递给适用的其他数据集。

如果这没有意义,请告诉我,我会尽快给出更完整的答案。

更完整的答案

在此示例中,我使用了 hte Northwind 示例数据库

我将展示如何生成可用于另一个数据集(或任意数量)的 WHERE 子句。在这个示例中,我将只使用一个。

我将有两个用于 where 子句选择的参数

ProductID 列表 列表或员工 ID

我们最终的数据集查询将是动态 sql,形成类似这样的语句..

SELECT 
       o.*
       , d.Discount, d.ProductID, d.Quantity, d.UnitPrice
    FROM Orders o
       JOIN [Order details] d on o.OrderID = d.OrderID
    WHERE ProductID in (11,42,72) and EmployeeID IN (3,5,6)

这是我采取的步骤:

创建了一个新的空白报告 向 Northwind 数据库添加了连接

创建了一个名为 dsProd 的数据集 将此数据集的查询设置为SELECT ProductID, ProductName FROM Products ORDER BY ProductName

创建了一个名为 dsEmployee 的数据集 将此数据集的查询设置为SELECT EmployeeID, FirstName FROM Employees ORDER BY FirstName

添加了一个名为pProd的参数 将参数设置为多值 将可用值设置为 dsProd 数据集 将值字段设置为ProductID 将标签字段设置为ProductName

添加了一个名为pEmp的参数 将参数设置为多值 将可用值设置为 dsEmployee 数据集 将值字段设置为EmployeeID 将标签字段设置为FirstName

添加了一个名为 pWHERE 的最终参数 将此默认值(指定值)设置为以下表达式

="WHERE ProductID IN (" & Join(Parameters!pProd.Value, ",") & ") " &
" AND EmployeeID IN (" & JOIN(Parameters!pEmp.Value, ",") & ")"

接下来添加了一个名为 dsResults 的数据集 将数据集查询设置为

DECLARE @SQL varchar (1000)

SET @SQL = 'SELECT 
       o.*
       , d.Discount, d.ProductID, d.Quantity, d.UnitPrice
    FROM Orders o
       JOIN [Order details] d on o.OrderID = d.OrderID '
       + @pWHERE

EXEC (@SQL)

最后我在报告中添加了一个指向dsResults 的表格来显示输出。

现在,当您选择员工和产品时,在 pWHERE 参数中构造 where 子句并传递给最终查询的数据集。

注意:回到我原来的观点,重申@StevenWhite 所说的话,所有这些可能都是不必要的。在这个简单的情况下,您可以简单地将最终数据集查询设置为

选择 o.* , d.Discount, d.ProductID, d.Quantity, d.UnitPrice FROM 订单 o JOIN [订单详情] d on o.OrderID = d.OrderID WHERE ProductID in (@pProd) 和 EmployeeID IN (@pEmp)

这将完成完全相同的工作,它会更快,您根本不需要 pWHERE 参数并且它会更可靠,上面的示例在第一次运行后可能会出现问题 pWHERE 参数可能没有正确刷新。

无论如何,这取决于你,但从长远来看,以正确的方式做事总是更快..

【讨论】:

感谢艾伦的回复。创建数据集时出现错误。您能否提供一个非常有帮助的示例。谢谢你。我的 where 条件类似于: where x.y IN (@Param1) and x.y in (@param2 ) and x.y is not null 等。 非常感谢艾伦。我今天会试试这个然后回来。另外,我正在尝试限制查询中 where 条件的使用,因为它大大降低了我的查询速度。 嗨艾伦!我尝试了完全相同的方法。我创建了一个新参数@as_where,其数据类型为文本并从其他参数中获取值。但是,当我完全按照您提到的方式使用数据集中的参数时。它无法获取参数值,并且弹出错误为“声明标量变量”。在数据集的参数选项卡中,我已经链接了参数。感谢你的帮助。我真的陷入了困境。 数据集属性不需要做任何事情,当数据集查询包含未定义的参数名称时,它将创建参数,如果您已经定义了它,那么它应该可以工作。数据集查询中的参数名称必须与 s-s-rS 参数名称完全匹配,区分大小写。 嘿艾伦,终于开始运行了。只需在 where 条件下对您的解决方案进行一个小修正。条件应在两端加上引号,例如列出对象中的 x in ('a','b'.'c')。像这样:="WHERE ProductID IN ('" & Join(Parameters!pProd.Value, "','") & " ') " & " AND EmployeeID IN ('" & JOIN(Parameters!pEmp.Value, "' ,'") & "')"

以上是关于在 s-s-rS 中,如何使用多值参数创建动态“位置”条件的主要内容,如果未能解决你的问题,请参考以下文章

使用 s-s-rS 表达式查看用户从多值参数中选择了哪些选项?

将多值列表值传递给 s-s-rS 报告参数的 SSAS 报告操作

s-s-rS 中的可选多值参数

需要解释将 s-s-rS 多值参数传递给 SQL 的工作原理

s-s-rS 多值参数只返回最后一个值

s-s-rS 多值参数