Sql-Server
嵌套儲存過程連接
我有一個儲存過程,它只是通過一組其他過程來查找導入的文件。主 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。