在 SSRS 中,如何使用多值参数创建动态 'where' 条件
In SSRS, how to create a dynamic 'where' condition using multi value parameters
首先我会提到一些我的工作,以便更好地理解我的问题
所以,在 SSRS 中,我有多个参数,它们都被发送到使用
=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)),',', ''',''') +
> ''')' + '
我的问题是: 如何在 SSRS 中创建这个@where 作为 dataset/parameter。我想这样做,以便我可以在连接到主摘要报告的详细报告中使用相同的@where,并在我单击摘要报告中的数字时传递到我的详细报告。我不想在我的详细信息 rdl
中再次重新创建相同的 where 条件
正如@StevenWhite 指出的那样,您可能需要重新考虑您的方法,但如果您真的想这样做的话。
您需要在报告中添加一个附加参数(您可以在一切正常后将其隐藏)
此参数的数据集将是您现有的动态 sql 代码,但只是 WHERE 子句部分,因此数据集查询的结尾只需执行类似 SELECT @where.
所以,一旦填充了其他参数,就会填充这个新参数,它的值将是您的 where 子句。然后,您可以将其作为参数传递给适用的其他数据集。
如果这没有意义,请告诉我,我会尽快给出更完整的答案。
更完整的答案
在此示例中,我使用了 hte Northwind
示例数据库
我展示了如何生成可用于另一个数据集(或任意多个数据集)的 WHERE 子句。在这个例子中,我只用一个来做。
我将有两个用于 where 子句选择的参数
- ProductID 列表
- 列表或 EmployeeID
我们最终的数据集查询将是动态的 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
的参数
将参数设置为 Mutil-value
将可用值设置为 dsProd
数据集
将值字段设置为 ProductID
将标签字段设置为 ProductName
添加了一个名为 pEmp
的参数
将参数设置为 Mutil-value
将可用值设置为 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)
最后我在报告中添加了一个 table 指向 dsResults
以显示输出。
现在,当您选择员工和产品时,where 子句在 pWHERE
参数中构建并传递给最终查询的数据集。
注意:回到我原来的观点,重申@StevenWhite 所说的话,所有这些可能都是不必要的。在这个简单的例子中,您可以简单地将最终数据集查询设置为
SELECT
o.*
, d.Discount, d.ProductID, d.Quantity, d.UnitPrice
FROM 订单 o
在 o.OrderID = d.OrderID 上加入 [订单详情] d
WHERE ProductID 在 (@pProd) 和 EmployeeID 在 (@pEmp)
这将完成完全相同的工作,它会更快,您根本不需要 pWHERE 参数并且它会更可靠,上面的示例可能会在第一个 运行 之后出现问题,因为pWHERE
参数可能无法正确刷新。
无论如何,这取决于你,但从长远来看,正确的方法总是更快 运行..
首先我会提到一些我的工作,以便更好地理解我的问题
所以,在 SSRS 中,我有多个参数,它们都被发送到使用 =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)),',', ''',''') +
> ''')' + '
我的问题是: 如何在 SSRS 中创建这个@where 作为 dataset/parameter。我想这样做,以便我可以在连接到主摘要报告的详细报告中使用相同的@where,并在我单击摘要报告中的数字时传递到我的详细报告。我不想在我的详细信息 rdl
中再次重新创建相同的 where 条件正如@StevenWhite 指出的那样,您可能需要重新考虑您的方法,但如果您真的想这样做的话。
您需要在报告中添加一个附加参数(您可以在一切正常后将其隐藏)
此参数的数据集将是您现有的动态 sql 代码,但只是 WHERE 子句部分,因此数据集查询的结尾只需执行类似 SELECT @where.
所以,一旦填充了其他参数,就会填充这个新参数,它的值将是您的 where 子句。然后,您可以将其作为参数传递给适用的其他数据集。
如果这没有意义,请告诉我,我会尽快给出更完整的答案。
更完整的答案
在此示例中,我使用了 hte Northwind
示例数据库
我展示了如何生成可用于另一个数据集(或任意多个数据集)的 WHERE 子句。在这个例子中,我只用一个来做。
我将有两个用于 where 子句选择的参数
- ProductID 列表
- 列表或 EmployeeID
我们最终的数据集查询将是动态的 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
的参数
将参数设置为 Mutil-value
将可用值设置为 dsProd
数据集
将值字段设置为 ProductID
将标签字段设置为 ProductName
添加了一个名为 pEmp
的参数
将参数设置为 Mutil-value
将可用值设置为 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)
最后我在报告中添加了一个 table 指向 dsResults
以显示输出。
现在,当您选择员工和产品时,where 子句在 pWHERE
参数中构建并传递给最终查询的数据集。
注意:回到我原来的观点,重申@StevenWhite 所说的话,所有这些可能都是不必要的。在这个简单的例子中,您可以简单地将最终数据集查询设置为
SELECT o.* , d.Discount, d.ProductID, d.Quantity, d.UnitPrice FROM 订单 o 在 o.OrderID = d.OrderID 上加入 [订单详情] d WHERE ProductID 在 (@pProd) 和 EmployeeID 在 (@pEmp)
这将完成完全相同的工作,它会更快,您根本不需要 pWHERE 参数并且它会更可靠,上面的示例可能会在第一个 运行 之后出现问题,因为pWHERE
参数可能无法正确刷新。
无论如何,这取决于你,但从长远来看,正确的方法总是更快 运行..