簡體   English   中英

使用SSIS中的執行包任務動態執行多個包

[英]Dynamically executing multiple packages using execute package task in SSIS

我正在嘗試動態執行幾個程序包。

我在數據庫中有一個表,用於存儲包名稱,每個表都有一個指示符,表示為“是/否”。 我的最終目標是執行帶有指標“ Y”的那些。

我正在創建一個變量,該變量采用指示器“ Y”下的所有軟件包名稱。

我為每個放置了執行包任務的循環容器使用。 我在每個循環中分配一個ADO枚舉數,並將變量分配給ADO對象源變量。

有沒有一種方法可以在“執行包”任務中使用屬性表達式,通過相同的解決方案,我可以通過該變量分配包名稱並動態執行必要的包(子包)?

您的方法是正確的,只需要稍作調整即可。
ExecutePackage Task具有屬性PackageName ,該屬性包含程序包的完整路徑。 對於SSISDB目錄,當您從項目中調用程序包時,它只是程序包名稱。 如果程序包存儲在MSDB中,則為“ \\\\ Folder1 \\\\ Folder2 \\\\ Packagename”。 您可以在表達式的幫助下隨意設置PackageName屬性(即,如果需要,則為前綴軟件包路徑)。
小例子 在此處輸入圖片說明

是的-我對這個問題的看法有所不同。 這將調用SQL Agent作業-作業的名稱作為變量傳遞-該變量將由FOR ... LOOP填充。

  • 作業執行
  • 我們監視sysjobactivity來檢測它何時實際運行以及何時完成。
  • 完成后,我們在sysjobhistory查找最新條目以查看狀態(執行停止后,該條目僅寫入該表-如果我們立即進行檢查,我們將獲得最新的已知狀態)

為了使此工作正常進行,您必須確信自己是唯一可能執行此工作的用戶-否則您可能會得到別人的歷史記錄!

運行作業的用戶需要MSDB中的SQLAGENTOPERATORROLE。

    SET NOCOUNT ON;

DECLARE @job_name VARCHAR(100) = 'YOU_JOB_NAME_HERE'
EXEC msdb.dbo.sp_start_job @job_name = @job_name

WHILE EXISTS(
    SELECT 1 FROM msdb.dbo.sysjobs_view job
    INNER JOIN msdb.dbo.sysjobactivity activity ON job.job_id = activity.job_id
    INNER JOIN msdb.dbo.syssessions sess ON sess.session_id = activity.session_id
    INNER JOIN (SELECT MAX(agent_start_date) AS max_agent_start_date FROM msdb.dbo.syssessions) sess_max ON sess.agent_start_date = sess_max.max_agent_start_date
    WHERE job.name = @job_name  AND run_requested_date IS NOT NULL AND stop_execution_date IS NULL
)
BEGIN
    PRINT 'Running'
    WAITFOR DELAY '00:00:01'
END
PRINT 'Finished'

SELECT TOP 1 HIST.run_status
    -- 0=Failed, 1=Succeeded 2=Retry 3=Cancelled
FROM msdb.dbo.sysjobs JOB
INNER JOIN  msdb.dbo.sysjobhistory HIST ON HIST.job_id = JOB.job_id
WHERE JOB.name = @job_name
ORDER BY HIST.run_date, HIST.run_time

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM