正如@StevenWhite 指出的那样,您可能需要重新考虑您的方法,但如果您真的想这样做。
您需要在报告中添加一个附加参数(一旦一切正常,您可以将其隐藏)
此参数的数据集将是您现有的动态 sql 代码,但只是 WHERE 子句部分,因此数据集查询的结尾只需执行 SELECT @where 之类的操作。
因此,一旦填充了其他参数,就会填充这个新参数,并且它的值将是您的 where 子句。然后,您可以将其作为参数传递给适用的其他数据集。
如果这没有意义,请告诉我,我会尽快给出更完整的答案。
更完整的答案
在此示例中,我使用了 hte Northwind 示例数据库
我将展示如何生成可用于另一个数据集(或任意数量)的 WHERE 子句。在这个示例中,我将只使用一个。
我将有两个用于 where 子句选择的参数
我们最终的数据集查询将是动态 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 参数可能没有正确刷新。
无论如何,这取决于你,但从长远来看,以正确的方式做事总是更快..