Stored procedures 如何确保存储过程在报表生成器3.0中构建数据集之前完成?
每次用户运行由report Builder 3.0构建的报表时,我都想使用SSIS包刷新一个表,因此我创建了一个SSIS作业,并从report Builder调用Stored procedures 如何确保存储过程在报表生成器3.0中构建数据集之前完成?,stored-procedures,reporting-services,ssis,reportbuilder,Stored Procedures,Reporting Services,Ssis,Reportbuilder,每次用户运行由report Builder 3.0构建的报表时,我都想使用SSIS包刷新一个表,因此我创建了一个SSIS作业,并从report Builder调用sp_start_job,作为调用此作业的存储过程 这一切都很好,但是报表在填充数据集之前不会等待作业完成(我可以判断,因为我的表中有一个“last refresh date”列) 有没有办法确保作业在数据加载到报表本身之前完成 Edit:因此我决定尝试调用该作业并在SELECT语句之前等待,如下所示: USE msdb; EXECU
sp_start_job
,作为调用此作业的存储过程
这一切都很好,但是报表在填充数据集之前不会等待作业完成(我可以判断,因为我的表中有一个“last refresh date”列)
有没有办法确保作业在数据加载到报表本身之前完成
Edit:因此我决定尝试调用该作业并在SELECT
语句之前等待,如下所示:
USE msdb;
EXECUTE dbo.sp_start_job N'CUBE - IS Inventory Report Refresh'
WAITFOR DELAY '00:00:25'
USE OtherDatabase;
SELECT ...
但是时间戳仍然显示一个较旧的日期。SSIS作业在17秒内运行(从历史记录日志中),因此在我从表中选择之前等待25秒应该足够了。。。有人知道为什么会发生这种情况吗
当我在ManagementStudio中运行查询时,返回的表显示了正确的时间戳,因此我认为这可能是报表生成器的问题(?),这是意料之中的。启动作业是一个异步调用,因此一旦启动,控制权就会返回给调用方。然后需要开始轮询sys作业表,以查看作业当前是否正在执行。您可以在同一个proc调用中执行此操作,一旦作业达到终端状态(完成、失败),您就可以将数据集返回给用户。这会回答你的问题,但天哪,那会变得难看
在人们使用报告之前,是否没有办法执行ETL?这是意料之中的。启动作业是一个异步调用,因此一旦启动,控制权就会返回给调用方。然后需要开始轮询sys作业表,以查看作业当前是否正在执行。您可以在同一个proc调用中执行此操作,一旦作业达到终端状态(完成、失败),您就可以将数据集返回给用户。这会回答你的问题,但天哪,那会变得难看
在人们使用报表之前,是否没有办法执行ETL?用户希望有一种方法可以从报表所基于的SharePoint列表中获取最新数据。由于报告的复杂性,而且我听说直接触摸SharePoint表不是一种好的做法,因此我决定最好的方法是将其导入到表中,并使用T-SQL魔术对数据进行处理。我不确定是否真的要轮询sys作业表,但出于好奇,在报表生成器中,您将如何实现这一点?我的假设是,启动代理作业的过程也会将数据返回给用户?基于这种假设,在执行msdb.dbo.sp_start_job somejob步骤和实际返回数据的select语句之间会有一个while循环。用户希望找到一种从报表所基于的SharePoint列表中获取最新数据的方法。由于报告的复杂性,而且我听说直接触摸SharePoint表不是一种好的做法,因此我决定最好的方法是将其导入到表中,并使用T-SQL魔术对数据进行处理。我不确定是否真的要轮询sys作业表,但出于好奇,在报表生成器中,您将如何实现这一点?我的假设是,启动代理作业的过程也会将数据返回给用户?基于这种假设,在
EXECUTE msdb.dbo.sp\u start\u job somejob
步骤和实际返回数据的select语句之间会有一个while循环。