我有一个存储过程,它只是通过一组其他进程查找导入的文件。主SP每5分钟运行一次,在目录中查找新文件,如果有较新的文件,则将它们导入暂存表。
此时,如果它确实导入了一个新添加的文件,那么还有另一个伴随的SP,即ETL将记录从暂存到另一个生产DB中。ETL (EXEC dbo.ETL)发生在每5分钟运行一次的监视SP中。
我的主要问题是,我是否可以让ETL存储过程独立于监视SP运行?如果ETL SP需要超过5分钟的时间,当再次调用监视SP时,如果5分钟前的最后一次调用仍在运行ETL过程,它会使用另一个连接吗?
IOW,我想每5分钟运行一个SP (SP #1),调用其他SPs (可能需要5分钟以上或少于5分钟),而不中断SP #1。
发布于 2021-01-31 18:20:26
解决方案可以是构建一个运行所需存储过程的简单SSIS包;然后以这种方式从tsql调用它:
declare @execution_id bigint
exec ssisdb.catalog.create_execution
@folder_name = 'folder'
,@project_name = 'project_name'
,@package_name = 'run_sp.dtsx'
,@execution_id = @execution_id output
exec ssisdb.catalog.start_execution @execution_id默认情况下,此调用是异步的。
发布于 2021-01-31 17:23:55
您是否要求您可以异步调用其他存储过程?不,不是本土的,可以这么说。我们通常有两种选择:
使用sp_start_job执行代理作业。请注意,代理作业没有参数,因此,如果要将数据传递到该作业,可以使用表作为通信机制。注意,如果ETL正在运行(通过已启动的代理作业),并且您的监视程序试图再次启动它,那么它将不会启动。如果作业已经在运行,代理将不会启动作业。
使用Service。这是SQL Server中的队列,因此“外部”proc可以向队列发送消息,您可以使用轮询机制轮询队列,也可以使用激活机制(Service在收到消息时启动某些内容)。
还是你的意思不一样?如果是,请澄清。您的最后一句有点混乱,因为您本质上说要运行sp #1而不中断sp #1。
https://dba.stackexchange.com/questions/284377
复制相似问题