你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 数据工厂中使用存储过程活动调用 SSIS 包

本文介绍如何使用存储过程活动从 Azure 数据工厂管道中调用 SSIS 包。

注意

本文适用于数据工厂版本 1。 如果使用当前版本的数据工厂服务,请参阅使用存储过程活动调用 SSIS 包

先决条件

Azure SQL 数据库

本文中的演练使用 Azure SQL 数据库。 还可使用 Azure SQL 托管实例。

创建 Azure-SSIS 集成运行时

如果还没有 Azure-SSIS 集成运行时,请按照教程:部署 SSIS 包。 无法使用数据工厂版本 1 创建 Azure-SSIS 集成运行时。

Azure PowerShell

在此部分中,将使用 Azure PowerShell 创建数据工厂管道,管道中包含可调用 SSIS 包的存储过程活动。

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

如何安装和配置 Azure PowerShell 中的说明安装最新的 Azure PowerShell 模块。

创建数据工厂

下列过程提供创建数据工厂的步骤。 可在数据工厂中使用存储过程活动创建管道。 存储过程活动在 SSISDB 数据库中执行存储过程,运行 SSIS 包。

  1. 为资源组名称定义一个变量,稍后会在 PowerShell 命令中使用该变量。 将以下命令文本复制到 PowerShell,在双引号中指定 Azure 资源组的名称,然后运行命令。 例如:"adfrg"

    $resourceGroupName = "ADFTutorialResourceGroup";
    

    如果该资源组已存在,请勿覆盖它。 为 $ResourceGroupName 变量分配另一个值,然后再次运行命令

  2. 若要创建 Azure 资源组,请运行以下命令:

    $ResGrp = New-AzResourceGroup $resourceGroupName -location 'eastus'
    

    如果该资源组已存在,请勿覆盖它。 为 $ResourceGroupName 变量分配另一个值,然后再次运行命令。

  3. 定义一个用于数据工厂名称的变量。

    重要

    更新数据工厂名称,使之全局唯一。

    $DataFactoryName = "ADFTutorialFactory";
    
  4. 要创建数据工厂,请运行下面的 New-AzDataFactory cmdlet,使用 $ResGrp 变量中的 Location 和 ResourceGroupName 属性:

    $df = New-AzDataFactory -ResourceGroupName $ResourceGroupName -Name $dataFactoryName -Location "East US"
    

请注意以下几点:

  • Azure 数据工厂的名称必须全局唯一。 如果收到以下错误,请更改名称并重试。

    The specified Data Factory name 'ADFTutorialFactory' is already in use. Data Factory names must be globally unique.
    
  • 若要创建数据工厂实例,用于登录到 Azure 的用户帐户必须属于参与者所有者角色,或者是 Azure 订阅的管理员

创建 Azure SQL 数据库链接服务

创建一个链接服务,将托管 SSIS 目录的 Azure SQL 数据库中的数据库链接到数据工厂。 数据工厂使用此链接服务中的信息连接到 SSISDB 数据库,并执行存储过程来运行 SSIS 包。

  1. 在 C:\ADF\RunSSISPackage 文件夹中创建一个名为 AzureSqlDatabaseLinkedService.json 的 JSON 文件,并在其中包含以下内容 :

    重要

    保存文件之前,请将 <servername>、<username>@<servername> 和 <password> 替换为 Azure SQL 数据库的值。

    {
        "name": "AzureSqlDatabaseLinkedService",
        "properties": {
            "type": "AzureSqlDatabase",
            "typeProperties": {
                "connectionString": "Server=tcp:<servername>.database.windows.net,1433;Database=SSISDB;User ID=<username>;Password=<password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30"
            }
        }
        }
    
  2. 在 Azure PowerShell 中,切换到 C:\ADF\RunSSISPackage 文件夹 。

  3. 运行 New-AzDataFactoryLinkedService cmdlet,创建链接服务:AzureSqlDatabaseLinkedService 。

    New-AzDataFactoryLinkedService $df -File ".\AzureSqlDatabaseLinkedService.json"
    

创建输出数据集

此输出数据集是一个虚拟数据集,用于驱动管道的计划。 注意,频率设置为“小时”,间隔设置为“1”。 因此,管道在启动至结束期间,一小时运行一次。

  1. 创建一个 OutputDataset.json 文件,并在其中包含以下内容:

    {
        "name": "sprocsampleout",
        "properties": {
            "type": "AzureSqlTable",
            "linkedServiceName": "AzureSqlLinkedService",
            "typeProperties": { },
            "availability": {
                "frequency": "Hour",
                "interval": 1
            }
        }
    }
    
  2. 运行 New-AzDataFactoryDataset cmdlet,创建一个数据集。

    New-AzDataFactoryDataset $df -File ".\OutputDataset.json"
    

使用存储过程活动创建管道

在此步骤中,使用存储过程活动创建管道。 该活动调用 sp_executesql 存储过程来运行 SSIS 包。

  1. 在 C:\ADF\RunSSISPackage 文件夹中创建一个名为 MyPipeline.json 的 JSON 文件,并在其中包含以下内容

    重要

    保存文件之前,请将 <folder name>、<project name> 和 <package name> 替换为 SSIS 目录中文件夹、项目和包的名称。

    {
        "name": "MyPipeline",
        "properties": {
            "activities": [{
                "name": "SprocActivitySample",
                "type": "SqlServerStoredProcedure",
                "typeProperties": {
                    "storedProcedureName": "sp_executesql",
                    "storedProcedureParameters": {
                        "stmt": "DECLARE @return_value INT, @exe_id BIGINT, @err_msg NVARCHAR(150)    EXEC @return_value=[SSISDB].[catalog].[create_execution] @folder_name=N'<folder name>', @project_name=N'<project name>', @package_name=N'<package name>', @use32bitruntime=0, @runinscaleout=1, @useanyworker=1, @execution_id=@exe_id OUTPUT    EXEC [SSISDB].[catalog].[set_execution_parameter_value] @exe_id, @object_type=50, @parameter_name=N'SYNCHRONIZED', @parameter_value=1    EXEC [SSISDB].[catalog].[start_execution] @execution_id=@exe_id, @retry_count=0    IF(SELECT [status] FROM [SSISDB].[catalog].[executions] WHERE execution_id=@exe_id)<>7 BEGIN SET @err_msg=N'Your package execution did not succeed for execution ID: ' + CAST(@exe_id AS NVARCHAR(20)) RAISERROR(@err_msg,15,1) END"
                    }
                },
                "outputs": [{
                    "name": "sprocsampleout"
                }],
                "scheduler": {
                    "frequency": "Hour",
                    "interval": 1
                }
            }],
            "start": "2017-10-01T00:00:00Z",
            "end": "2017-10-01T05:00:00Z",
            "isPaused": false
        }
    }    
    
  2. 要创建管道 RunSSISPackagePipeline,请运行 New-AzDataFactoryPipeline cmdlet 。

    $DFPipeLine = New-AzDataFactoryPipeline -DataFactoryName $DataFactory.DataFactoryName -ResourceGroupName $ResGrp.ResourceGroupName -Name "RunSSISPackagePipeline" -DefinitionFile ".\RunSSISPackagePipeline.json"
    

监视管道运行

  1. 运行 Get-AzDataFactorySlice,获取有关输出数据集**(管道的输出表)的所有切片的详细信息。

    Get-AzDataFactorySlice $df -DatasetName sprocsampleout -StartDateTime 2017-10-01T00:00:00Z
    

    请注意,此处指定的 StartDateTime 与在管道 JSON 中指定的开始时间是相同的。

  2. 运行 Get-AzDataFactoryRun,获取特定切片的活动运行详细信息。

    Get-AzDataFactoryRun $df -DatasetName sprocsampleout -StartDateTime 2017-10-01T00:00:00Z
    

    可以继续运行此 cmdlet,直到切片进入“就绪”状态或“失败”状态。

    可在服务器中针对 SSISDB 数据库运行以下查询,验证是否执行了该包。

    select * from catalog.executions
    

后续步骤

有关存储过程活动的详细信息,请参阅存储过程活动一文。