Sql-Server

嵌套儲存過程連接

  • January 31, 2021

我有一個儲存過程,它只是通過一組其他過程來查找導入的文件。主 SP 每 5 分鐘執行一次,並在目錄中查找新文件,如果有較新的文件,則將它們導入臨時表。

此時,如果它確實導入了一個新添加的文件,那麼還有另一個附帶的 SP,它會將 ETL 的記錄從暫存到另一個生產數據庫中。ETL ( EXEC dbo.ETL) 發生在每 5 分鐘執行一次的監控 SP 內。

我的主要問題是,我可以讓 ETL 儲存過程獨立於監控 SP 執行嗎?如果 ETL SP 耗時超過 5 分鐘,當再次呼叫監控 SP 時,如果 5 分鐘前的最後一次呼叫仍在執行 ETL 過程,它是否會使用另一個連接?

IOW,我想每 5 分鐘執行一次 SP(SP #1),呼叫其他 SP(可能需要多於或少於 5 分鐘)而不中斷 SP #1

一個解決方案可能是建構一個簡單的 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

這個呼叫預設是非同步的

您是否要求您可以非同步呼叫其他一些儲存過程?不,不是本地的,可以這麼說。我們通常有兩種選擇:

使用 sp_start_job 執行代理作業。請注意,代理作業沒有參數,因此如果您想將數據傳遞給該作業,可以說,您可以使用表作為通信機制。請注意,如果 ETL 正在執行(通過已啟動的代理作業)並且您的監控過程嘗試再次啟動它,那麼它將不會啟動。如果它已經在執行,代理將不會啟動它。

使用服務代理。這是在 SQL Server 中排隊,因此您的“外部”過程可以將消息發送到隊列,並且您可以使用輪詢機制來輪詢隊列或啟動(服務代理在收到消息時啟動某些操作)。

或者你的意思是不同的?如果是這樣,請澄清。你的最後一句話有點令人困惑,因為你本質上說你想在不中斷 sp #1 的情況下執行 sp #1。

引用自:https://dba.stackexchange.com/questions/284377