從SQL Server中的存儲過程執行SSIS包


問題

我們的組織一直在使用 SSIS包來執行與后端數據庫直接相關的各種操作。我們希望能夠直接從我們的應用程序中利用這些功能。通常,我們構建SSIS程序包,將它們部署到 SSIS目錄中,然后根據計划從SQL Server代理作業中執行程序包 盡管這很好用,但我們希望能夠從應用程序執行SSIS包並在運行時指定包參數的值。

例如,我們提供了一個基於雲的CRM應用程序。我們希望推出一個完全自助服務的新客戶入職流程。當客戶注冊我們的服務時,他們需要從現有系統中獲取數據並加載到我們的應用程序中。我們將提供一個Web界面,客戶可以在其中通過簡單的CSV文件加載其數據。Web應用程序將允許客戶導航到CSV文件並上傳文件。上載會將文件放在我們服務器上的文件夾中,並且Web應用程序將執行SSIS包以執行加載。

我們怎樣才能做到這一點?

 

 

SQL Server集成服務(SSIS)提供了SSISDB數據庫,該數據庫包含存儲過程和視圖,使您可以使用SSIS項目和部署到Integration Services Catalog的程序包。我將采用的實現目標的方法是創建SQL對象,這些對象可以使用存儲過程從目錄中執行SSIS包。存儲過程將利用SSISDB數據庫中的對象以及一些支持對象。

這種方法有很大的好處。您已經具有可以執行的現有SSIS程序包。通過在應用程序的各個位置執行這些SSIS包,您可以重用現有過程。

作為參考,請看一下前面的技巧“ 如何從SQL Server存儲過程執行Integration Services(SSIS)程序包”該技巧顯示了一個通過存儲過程執行SSIS包的簡單示例。它沒有涉及處理項目和包參數的細節。技巧介紹了執行存儲過程所需的ADO.NET代碼。在這種情況下,我將從SQL Server開發人員的角度提供演示,重點介紹執行存儲過程所需的T-SQL。

以下是實現此解決方案的概述:

  • 查看已部署到目錄的SSIS包的關鍵點
  • 將SSIS項目和程序包部署到目錄后,請查看SSIS目錄
  • 詳細介紹如何創建可以執行部署到SSIS目錄的SSIS包的存儲過程
  • 演示使用簡單的T-SQL執行存儲過程,並逐步執行SSIS目錄報告以查看其工作方式的詳細信息

SSIS程序包審查

我們的出發點是查看將在演示中使用的SSIS軟件包。重點將放在與SSIS目錄中的部署以及從目錄中執行程序包相關的程序包部分。包裝非常簡單。它將CSV文件從文件夾加載到SQL Server表中。

SSIS具有項目參數和程序包參數,以使SSIS程序包可重復使用。項目參數是適用於項目中多個SSIS包的參數。程序包參數是特定於單個SSIS程序包的值。SSIS目錄提供了存儲和更新參數值以及在執行程序包時指定參數值的功能。

 

 

您可以在SSIS項目下方的Visual Studio(或SQL Server數據工具)的解決方案資源管理器中看到項目參數(Project.params),如下所示:

項目參數

雙擊Project.params節點以顯示項目參數: 

  項目參數

要點如下:

  • CRM_Flat_File_Folder是SSIS程序包將在其中檢查CSV文件以加載到SQL Server表中的文件夾。通常,這將是UNC路徑(例如\\ SERVERNAME \ FOLDERNAME),但是出於演示目的,我僅使用本地計算機上的文件夾。請注意,在運行SQL Server的服務器(本例中為本地計算機)上訪問該文件夾。
  • CRM_Staging_ServerName是運行SQL Server實例的服務器名稱。通常這不是本地計算機,但是出於演示目的,我正在使用本地計算機。
  • 兩個項目參數都將Required屬性設置為True。這表明在部署到SSIS目錄時,我們應該提供不同的值。開發和測試軟件包時,將使用SSIS軟件包中的項目參數值。

您可以通過在SSIS包設計器中單擊“參數”選項卡來查看包參數。示例程序包具有以下程序包參數:

包裝參數

package參數用於指定要加載的實際文件名。每次執行包時,這通常會有所不同。在創建和測試程序包時使用上面顯示的值。Required屬性為True,表示在將程序包部署到SSIS目錄時,通常是從目錄執行程序包時,需要指定一個值。例如,當您在SQL代理作業步驟中從目錄執行SSIS包時,將被迫輸入所需包參數的值。

SSIS項目目錄部署

現在,我們已經查看了樣本SSIS包,在將SSIS項目部署到Integration Service Catalog之后,我將對其進行回顧。創建Integration Services目錄,將SSIS項目部署到目錄以及創建環境涉及兩個步驟。

打開SQL Server Management Studio(SSMS),然后導航到“對象資源管理器”中的“集成服務目錄”,如下所示:

集成服務目錄

以下是要點:

  • CRM是部署項目的文件夾名稱
  • CRM_OnBoarding是SSIS項目的名稱
  • LoadCustomers.dtsx是SSIS項目中的SSIS程序包;我將在演示中執行它
  • DEFAULT是包含項目參數值的環境的名稱

該環境具有變量及其值的列表。雙擊DEFAULT,變量和值將顯示如下:

sis變量

項目參數在SSIS包中定義。通常,您使用與包中指定的值不同的值。由於這只是一個演示,所以我沒有。但是,使用環境的好處是,如果需要更改任何值,則可以在環境中更新它們,而不必更改SSIS包。SSIS項目中的任何程序包都可以在運行時使用環境變量值。

要查看環境如何與項目連接,請右鍵單擊CRM_OnBoarding項目,然后從上下文菜單中選擇“配置”。單擊“引用”后,下面將顯示“配置”窗口(您必須添加對要在SSIS項目中使用的環境的引用):

配置連接

將對環境的引用添加到項目后,您可以將環境變量映射到項目參數。單擊參數,您將看到映射:

配置連接

當“值”列顯示帶有下划線的變量名稱時,該值來自具有該名稱的環境變量。您可以引用多個環境。無論您在運行時使用什么環境,都將執行映射。

Customer_Flat_File_Name是一個包參數,因此該值顯示要使用的文件名,而不是到環境變量的映射。我將展示從存儲過程執行SSIS包時如何指定值。

創建一個存儲過程以執行SSIS包

至此,我們將逐步完成一個存儲過程,該過程將執行Integration Services Catalog中部署的SSIS包。存儲過程如下所示:

CREATE PROCEDURE [dbo].[ExecuteLoadCustomersSSISPackage]
    @CUSTOMER_FLAT_FILE_NAME   NVARCHAR(50)
,   @EXECUTION_ID              BIGINT OUTPUT
AS
BEGIN
   -- 1. declare variables
   DECLARE
       @PROCEDURE_NAME  SYSNAME
   ,   @FOLDER_NAME     NVARCHAR(128)
   ,   @PROJECT_NAME    NVARCHAR(128)
   ,   @PACKAGE_NAME    NVARCHAR(128)
   ,   @REFERENCE_ID    BIGINT;
 
   -- 2. get this stored procedure's name
   SET @PROCEDURE_NAME = OBJECT_NAME(@@PROCID);
 
   -- 3. get the parameters for executing the SSIS package
   SELECT 
       @FOLDER_NAME  = [FOLDER_NAME]   
   ,   @PROJECT_NAME = [PROJECT_NAME]   
   ,   @PACKAGE_NAME = [PACKAGE_NAME]  
   ,   @REFERENCE_ID = [REFERENCE_ID]
   FROM [dbo].[ProcedureToCreateExecutionMapping]
   WHERE [ProcedureName] = @PROCEDURE_NAME;
 
   -- 4. check if 1 row was returned
   IF @@ROWCOUNT <> 1
   BEGIN
      -- throw error
      RETURN;
   END
 
   -- 5. create the package execution
   EXEC [SSISDB].[catalog].[create_execution]
       @folder_name = @FOLDER_NAME
   ,   @project_name = @PROJECT_NAME
   ,   @package_name = @PACKAGE_NAME
   ,   @reference_id = @REFERENCE_ID
   ,   @execution_id = @EXECUTION_ID OUTPUT;
 
   -- 6. set value for Customer_Flat_File_Name package parameter
   EXEC [SSISDB].[catalog].[set_execution_parameter_value]
        @execution_id = @EXECUTION_ID  
    ,   @object_type = 30 -- package parameter 
    ,   @parameter_name = N'Customer_Flat_File_Name'  
    ,   @parameter_value = @CUSTOMER_FLAT_FILE_NAME;
   
   -- 7. start the execution
   EXEC [SSISDB].[catalog].[start_execution]
      @execution_id = @EXECUTION_ID;
 
END 

為了從目錄中執行SSIS包,我們需要許多值。我創建了ProcedureToCreateExecuteMapping表來存儲這些值。ProcedureName列使我可以根據正在運行的存儲過程來檢索參數值。

為了從目錄中執行SSIS包,我們必須從SSISDB數據庫中至少執行兩個存儲過程:create_execution和start_execution。在create_execution中,我們指定標識要執行的軟件包所需的詳細信息(文件夾名稱,項目名稱和軟件包名稱)。我們還指定環境的參考ID。成功執行create_execution時,它將返回EXECUTION_ID。SSIS包尚未運行。

在create_execution之后,我們可以執行其他存儲過程。在這種情況下,我們執行set_execution_parameter_value,這使我們可以為Customer_Flat_File_Name包參數指定值。我們傳入要加載的文件名,並從create_execution返回EXECUTION_ID值。

最后,我們執行start_execution存儲過程,並傳入從create_execution返回的EXECUTION_ID值。此時,SSIS包正在運行。

在繼續執行存儲過程之前,我想澄清一個細節。ProcedureToCreateExecutionMapping表返回了[REFERENCE_ID]列(這是環境參考),將項目連接到環境。為了獲得此值,您必須執行以下查詢:

-- get the folder_id
SELECT *
FROM [SSISDB].[catalog].[folders]
WHERE [name] = 'CRM';
-- [folder_id] = 20004
 
-- get the project_id
SELECT *
FROM [SSISDB].[catalog].[projects]
WHERE [folder_id] = 20004;
-- [project_id] = 40007
 
-- get the environment reference id
SELECT *
FROM [SSISDB].[catalog].[environment_references]
WHERE [project_id] = 40007;
-- [reference_id] = 30005 

為了獲取環境參考,您必須使用SSISDB數據庫中的視圖獲取folder_id和project_id,如上所示。

執行存儲過程

現在,我們已經創建了存儲過程以從目錄中執行SSIS包,是時候運行它了。使用以下T-SQL運行存儲過程:

DECLARE @P_EXECUTION_IDBIGINT;
 
EXEC [dbo].[ExecuteLoadCustomersSSISPackage]
    @CUSTOMER_FLAT_FILE_NAME=N'CustomerSample.csv'
,   @EXECUTION_ID= @P_EXECUTION_IDOUTPUT;
 
SELECT @P_EXECUTION_ID;
 
SELECT
    [start_time]
,   [end_time]
,   [status]
FROM [SSISDB].[catalog].[executions]
WHERE [execution_id]= @P_EXECUTION_ID;

SSISDB.catalog.create_execution存儲過程返回了@execution_id OUTPUT參數。上面的存儲過程也將它作為OUTPUT參數返回。要檢查SSIS包的狀態,請檢查[SSISDB]。[catalog]。[executions]視圖。[status]列具有成功= 7的多個可能值。檢查 catalog.executions以獲取詳細信息。在SSIS包失敗或成功之前,您可能必須多次查詢catalog.executions。

SSIS目錄提供有關SSIS包執行的詳細信息。返回到SSMS Object Explorer中的Integration Services目錄,右鍵單擊SSIS包,選擇“報告”,“標准報告”和“所有執行”,如下所示:

集成服務目錄

執行細節將顯示如下:

包執行

在上述情況下,您可以看到執行成功。有多個鏈接可用於檢索其他詳細信息。我將在“概述”鏈接上介紹關鍵點:執行概述和使用的參數。

“執行概述”顯示SSIS包中已運行的任務以及“執行路徑”列中的鏈接,以提供更多信息:

包執行

使用的參數顯示項目和包參數的實際值,以及其他一些信息:

使用的參數

在進行故障排除時,能夠查看所使用的實際值非常有用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM