如果我在 SSRS 中有两个来自存储过程的数据集,我可以在它们之间传递数据吗?
If I have two Datasets in SSRS which are from stored procedures, can I pass data between them?
我有一个 SSRS 报告,它创建了一个包含客户 ID 及其相关批次代码的多页报告。
- 我们通常每隔几周向客户发送一次报告,但报告可能会在 week/month 的任何一天 运行。
- 报告必须只包含尚未发送的客户 ID。
我通过在 "Sent" table 中记录已发送的客户 ID 来实现此目的,然后加入该 ID 以排除已发送的 ID。
第 1 页来自一个存储过程,第 2 页来自另一个存储过程。
Stored Proc 1 / Page 1 是 select 客户帐户,包括尚未 selected 的批处理代码,然后存储过程将这些详细信息记录到已发送的 table:
--Select new records for report into temp table
SELECT a.CustomerID,
a.BatchCode
INTO #CustomersToSend
FROM dbo.CustomerBatches a
LEFT JOIN dbo.Sent b ON a.CustomerID = b.CustomerID
WHERE b.SentDate IS NULL
--Insert these records into the sent table
INSERT INTO dbo.Sent
SELECT CustomerID,
GETDATE() AS SentDate
FROM #CustomersToSend
--Select the temp table to produce the report output
SELECT *
FROM #CustomersToSend
Stored Proc 2 需要是第 1 页中包含的批代码的摘要:
--Batch Summary
SELECT BatchCode,
COUNT(*) AS TotalCustomers
FROM dbo.CustomerBatches
GROUP BY BatchCode
我需要以与筛选第一个查询相同的方式来筛选此查询,排除任何已发送的 CustomerID。
我的问题是我不知道 SSRS 如何处理此类报告。
如果它 运行s 存储过程 1,等待它完成,然后 运行s 存储过程 2,那么很好,我可以使用 dbo.Sent 中的 SentDate 来过滤在最后几秒发送的 CustomerIDs 上。
如果 运行 同时存储过程 1 和过程 2,那么我可能会使用与存储过程 1 相同的逻辑,左连接到 dbo.Sent 以排除发送了 CustomerID。我不确定如果存储过程 2 在存储过程 1 试图写入 dbo.Sent 的那一刻 运行 会发生什么,但是...
理想情况下,我会先 运行 存储过程 2,等待它完成,然后 运行 存储过程 1。但是我从存储过程 1 的输出 必须 成为报告的第 1 页。我想如果它 运行 它们是串行的而不是并行的,那么它会按页面顺序进行吗?
任何帮助/见解将不胜感激。
好的,所以我做了一些挖掘,SSRS 恰好同时触发了两个存储过程。
这是好是坏。不好,因为我无法在报告 运行 期间将任何数据从一个过程传递到另一个过程,但是很好,因为这意味着只要我的两个查询在开始时是相同的,它们就应该完成构建临时 table 在同一时间。
所以我的存储过程 1 保持不变,但我的存储过程 2 现在是这样的:
--Select new records for report into temp table
SELECT a.CustomerID,
a.BatchCode
INTO #CustomersToSend2
FROM dbo.CustomerBatches a
LEFT JOIN dbo.Sent b ON a.CustomerID = b.CustomerID
WHERE b.SentDate IS NULL
--Batch Summary
SELECT BatchCode,
COUNT(*) AS TotalCustomers
FROM #CustomersToSend2
GROUP BY BatchCode
由于两个查询 运行 是并行的,所以它们在同一时刻开始时就完成了临时 table 的构建(在查询 1 有机会开始向 [=21 添加行之前=]) 所以他们在各自的温度 tables.
中都有完全相同的数据
我想唯一的风险是,如果有一些问题阻止了查询 2 的启动,但并没有阻止查询 1 的启动,我的摘要中可能没有结果,但我认为应该没问题。
我建议只使用一个数据集。您可以在第二页的摘要 table 中重复使用您的第一个数据集,将 table 中的记录按 BatchCode
分组,然后让 SSRS 进行计数。
我有一个 SSRS 报告,它创建了一个包含客户 ID 及其相关批次代码的多页报告。
- 我们通常每隔几周向客户发送一次报告,但报告可能会在 week/month 的任何一天 运行。
- 报告必须只包含尚未发送的客户 ID。
我通过在 "Sent" table 中记录已发送的客户 ID 来实现此目的,然后加入该 ID 以排除已发送的 ID。
第 1 页来自一个存储过程,第 2 页来自另一个存储过程。
Stored Proc 1 / Page 1 是 select 客户帐户,包括尚未 selected 的批处理代码,然后存储过程将这些详细信息记录到已发送的 table:
--Select new records for report into temp table
SELECT a.CustomerID,
a.BatchCode
INTO #CustomersToSend
FROM dbo.CustomerBatches a
LEFT JOIN dbo.Sent b ON a.CustomerID = b.CustomerID
WHERE b.SentDate IS NULL
--Insert these records into the sent table
INSERT INTO dbo.Sent
SELECT CustomerID,
GETDATE() AS SentDate
FROM #CustomersToSend
--Select the temp table to produce the report output
SELECT *
FROM #CustomersToSend
Stored Proc 2 需要是第 1 页中包含的批代码的摘要:
--Batch Summary
SELECT BatchCode,
COUNT(*) AS TotalCustomers
FROM dbo.CustomerBatches
GROUP BY BatchCode
我需要以与筛选第一个查询相同的方式来筛选此查询,排除任何已发送的 CustomerID。
我的问题是我不知道 SSRS 如何处理此类报告。
如果它 运行s 存储过程 1,等待它完成,然后 运行s 存储过程 2,那么很好,我可以使用 dbo.Sent 中的 SentDate 来过滤在最后几秒发送的 CustomerIDs 上。
如果 运行 同时存储过程 1 和过程 2,那么我可能会使用与存储过程 1 相同的逻辑,左连接到 dbo.Sent 以排除发送了 CustomerID。我不确定如果存储过程 2 在存储过程 1 试图写入 dbo.Sent 的那一刻 运行 会发生什么,但是...
理想情况下,我会先 运行 存储过程 2,等待它完成,然后 运行 存储过程 1。但是我从存储过程 1 的输出 必须 成为报告的第 1 页。我想如果它 运行 它们是串行的而不是并行的,那么它会按页面顺序进行吗?
任何帮助/见解将不胜感激。
好的,所以我做了一些挖掘,SSRS 恰好同时触发了两个存储过程。
这是好是坏。不好,因为我无法在报告 运行 期间将任何数据从一个过程传递到另一个过程,但是很好,因为这意味着只要我的两个查询在开始时是相同的,它们就应该完成构建临时 table 在同一时间。
所以我的存储过程 1 保持不变,但我的存储过程 2 现在是这样的:
--Select new records for report into temp table
SELECT a.CustomerID,
a.BatchCode
INTO #CustomersToSend2
FROM dbo.CustomerBatches a
LEFT JOIN dbo.Sent b ON a.CustomerID = b.CustomerID
WHERE b.SentDate IS NULL
--Batch Summary
SELECT BatchCode,
COUNT(*) AS TotalCustomers
FROM #CustomersToSend2
GROUP BY BatchCode
由于两个查询 运行 是并行的,所以它们在同一时刻开始时就完成了临时 table 的构建(在查询 1 有机会开始向 [=21 添加行之前=]) 所以他们在各自的温度 tables.
中都有完全相同的数据我想唯一的风险是,如果有一些问题阻止了查询 2 的启动,但并没有阻止查询 1 的启动,我的摘要中可能没有结果,但我认为应该没问题。
我建议只使用一个数据集。您可以在第二页的摘要 table 中重复使用您的第一个数据集,将 table 中的记录按 BatchCode
分组,然后让 SSRS 进行计数。