使用 Azure 数据工厂从 SAP 表复制数据

适用于: Azure 数据工厂

本文概述如何使用 Azure 数据工厂中的复制活动从 SAP 表复制数据。 有关详细信息,请参阅复制活动概述

提示

若要了解对 SAP 数据集成方案的总体支持,请参阅使用 Azure 数据工厂进行 SAP 数据集成白皮书,其中包含有关每个 SAP 连接器的详细介绍、比较和指导。

支持的功能

以下活动支持此 SAP 表连接器:

可以将数据从 SAP 表复制到任何受支持的接收器数据存储。 有关复制活动支持作为源或接收器的数据存储列表,请参阅支持的数据存储表。

具体而言,此 SAP 表连接器支持:

  • 在以下产品中从 SAP 表复制数据:

    • SAP ERP 中心组件 (SAP ECC) 7.01 或更高版本(包含在 2015 年之后发布的最新 SAP 支持包堆栈中)。
    • SAP Business Warehouse (SAP BW) 版本 7.01 或更高版本(位于最新的 SAP 支持包堆栈中,该堆栈是 2015 年以后发布的)。
    • SAP S/4HANA。
    • SAP Business Suite 版本 7.01 或更高版本(位于最新的 SAP 支持包堆栈中,该堆栈是 2015 年以后发布的)中的其他产品。
  • 从 SAP 透明表、共用表、聚集表和视图复制数据。

  • 使用基本身份验证或安全网络通信 (SNC)(如果已配置 SNC)复制数据。

  • 连接到 SAP 应用程序服务器或 SAP 消息服务器。

  • 通过默认或自定义 RFC 检索数据。

版本 7.01 或更高版本指 SAP NetWeaver 版本,而不是 SAP ECC 版本。 例如,SAP ECC 6.0 EHP 7 的 NetWeaver 版本一般 >=7.4。 如果你不确定自己的环境,请在 SAP 系统中执行以下步骤来确认版本:

  1. 使用 SAP GUI 连接到 SAP 系统。
  2. 转到“系统” -> “状态” 。
  3. 检查 SAP_BASIS 的版本,确保它等于或大于 701。
    检查 SAP_BASIS

先决条件

若要使用此 SAP 表连接器,需要:

  • 安装自承载集成运行时(3.17 或更高版本)。 有关详细信息,请参阅创建和配置自承载集成运行时

  • 从 SAP 网站下载 64 位 SAP Connector for Microsoft .NET 3.0,并将其安装到自承载集成运行时计算机上。 安装期间,请在“可选安装步骤”窗口中确保选择“将程序集安装到 GAC”选项。

    安装 SAP Connector for .NET

  • 在 SAP 表连接器中使用的 SAP 用户必须拥有以下权限:

    • 使用远程函数调用 (RFC) 目标的授权。
    • 对 S_SDSAUTH 授权对象拥有“执行”活动权限。 有关多数授权对象,请参阅“SAP 说明 460089”。 基础 NCo 连接器需要某些 RFC,例如 RFC_FUNCTION_SEARCH。

入门

若要使用管道执行复制活动,可以使用以下工具或 SDK 之一:

使用 UI 创建指向 SAP 表的链接服务

使用以下步骤在 Azure 门户 UI 中创建指向 SAP 表的链接服务。

  1. 浏览到 Azure 数据工厂中的“管理”选项卡并选择“链接服务”,然后单击“新建”:

    屏幕截图,显示如何使用 Azure 数据工厂 UI 创建新的链接服务。

  2. 搜索“SAP”并选择“SAP 表连接器”。

    “SAP 表连接器”的屏幕截图。

  3. 配置服务详细信息,测试连接,然后创建新的链接服务。

    SAP 表链接服务的配置的屏幕截图。

连接器配置详细信息

以下部分详细介绍了用于定义特定于 SAP 表连接器的实体的属性。

链接服务属性

SAP BW Open Hub 链接服务支持以下属性:

属性 说明 必须
type type 属性必须设置为 SapTable
server SAP 实例所在的服务器的名称。
用于连接到 SAP 应用程序服务器。
systemNumber SAP 系统的系统编号。
用于连接到 SAP 应用程序服务器。
允许的值:用字符串表示的两位十进制数。
messageServer SAP 消息服务器的主机名。
用于连接到 SAP 消息服务器。
messageServerService 消息服务器的服务名称或端口号。
用于连接到 SAP 消息服务器。
systemId 表所在的 SAP 系统的 ID。
用于连接到 SAP 消息服务器。
logonGroup SAP 系统的登录组。
用于连接到 SAP 消息服务器。
clientId SAP 系统中客户端的 ID。
允许的值:用字符串表示的三位十进制数。
language SAP 系统使用的语言。
默认值为 EN
userName 有权访问 SAP 服务器的用户名。
password 用户的密码。 将此字段标记为 SecureString 类型以安全地存储它,或引用存储在 Azure 密钥保管库中的机密
sncMode 用于访问表所在的 SAP 服务器的 SNC 激活指示符。
若要使用 SNC 连接到 SAP 服务器,可以使用此属性。
允许的值为 0(关闭,默认值)或 1(打开)。
sncMyName 用于访问表所在的 SAP 服务器的发起方 SNC 名称。
sncMode 打开时适用。
sncPartnerName 用于访问表所在的 SAP 服务器的通信合作伙伴 SNC 名称。
sncMode 打开时适用。
sncLibraryPath 用于访问表所在的 SAP 服务器的外部安全产品库。
sncMode 打开时适用。
sncQop 要应用的保护级别的 SNC 质量。
sncMode 打开时适用。
允许的值为 1(身份验证)、2(完整性)、3(隐私)、8(默认值)和 9(最大值)。
connectVia 用于连接到数据存储的集成运行时。 如前面的先决条件中所述,需要安装自承载集成运行时。

示例 1:连接到 SAP 应用程序服务器

{
    "name": "SapTableLinkedService",
    "properties": {
        "type": "SapTable",
        "typeProperties": {
            "server": "<server name>",
            "systemNumber": "<system number>",
            "clientId": "<client ID>",
            "userName": "<SAP user>",
            "password": {
                "type": "SecureString",
                "value": "<Password for SAP user>"
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

示例 2:连接到 SAP 消息服务器

{
    "name": "SapTableLinkedService",
    "properties": {
        "type": "SapTable",
        "typeProperties": {
            "messageServer": "<message server name>",
            "messageServerService": "<service name or port>",
            "systemId": "<system ID>",
            "logonGroup": "<logon group>",
            "clientId": "<client ID>",
            "userName": "<SAP user>",
            "password": {
                "type": "SecureString",
                "value": "<Password for SAP user>"
            }
        },
        "connectVia": {
            "referenceName": "<name of integration runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

示例 3:使用 SNC 进行连接

{
    "name": "SapTableLinkedService",
    "properties": {
        "type": "SapTable",
        "typeProperties": {
            "server": "<server name>",
            "systemNumber": "<system number>",
            "clientId": "<client ID>",
            "userName": "<SAP user>",
            "password": {
                "type": "SecureString",
                "value": "<Password for SAP user>"
            },
            "sncMode": 1,
            "sncMyName": "<SNC myname>",
            "sncPartnerName": "<SNC partner name>",
            "sncLibraryPath": "<SNC library path>",
            "sncQop": "8"
        },
        "connectVia": {
            "referenceName": "<name of integration runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

数据集属性

有关用于定义数据集的各个部分和属性的完整列表,请参阅数据集。 以下部分提供 SAP 表数据集支持的属性的列表。

支持使用以下属性从/向 SAP BW Open Hub 链接服务复制数据。

属性 说明 必须
type type 属性必须设置为 SapTableResource
tableName 要从中复制数据的 SAP 表的名称。

示例

{
    "name": "SAPTableDataset",
    "properties": {
        "type": "SapTableResource",
        "typeProperties": {
            "tableName": "<SAP table name>"
        },
        "schema": [],
        "linkedServiceName": {
            "referenceName": "<SAP table linked service name>",
            "type": "LinkedServiceReference"
        }
    }
}

复制活动属性

有关用于定义活动的各部分和属性的完整列表,请参阅管道。 以下部分提供 SAP 表源支持的属性的列表。

SAP 表作为源

支持使用以下属性从 SAP 表复制数据:

属性 说明 必须
type type 属性必须设置为 SapTableSource
rowCount 要检索的行数。
rfcTableFields 要从 SAP 表复制的字段(列)。 例如,column0, column1
rfcTableOptions 用于筛选 SAP 表中的行的选项。 例如,COLUMN0 EQ 'SOMEVALUE'。 另请参阅本文稍后提供的 SAP 查询运算符表。
customRfcReadTableFunctionModule 可用于从 SAP 表读取数据的自定义 RFC 函数模块。
可以使用自定义 RFC 函数模块来定义如何从 SAP 系统检索数据并将其返回到服务。 必须为自定义函数模块实现一个接口(导入、导出、表),类似于服务使用的默认接口 /SAPDS/RFC_READ_TABLE2
partitionOption 要从 SAP 表中读取的分区机制。 支持的选项包括:
  • None
  • PartitionOnInt(在左侧用零填充正常整数或整数值,例如 0000012345
  • PartitionOnCalendarYear(采用“YYYY”格式的 4 位数)
  • PartitionOnCalendarMonth(采用“YYYYMM”格式的 6 位数)
  • PartitionOnCalendarDate(采用“YYYYMMDD”格式的 8 位数)
  • PartitionOntime(采用“HHMMSS”格式的 6 位数,例如 235959
partitionColumnName 用于将数据分区的列的名称。
partitionUpperBound partitionColumnName 中指定的用于继续分区的列的最大值。
partitionLowerBound partitionColumnName 中指定的用于继续分区的列的最小值。 (注意:当分区选项为 PartitionOnInt 时,partitionLowerBound 不能为“0”)
maxPartitionsNumber 要将数据拆分成的最大分区数。 默认值为 1。
sapDataColumnDelimiter 单个字符,将用作传递给 SAP RFC 的分隔符,以用于拆分输出数据。

提示

如果 SAP 表包含大量数据(例如几十亿行),请使用 partitionOptionpartitionSetting 将数据拆分成小分区。 在这种情况下,将按分区读取数据,并通过单个 RFC 调用从 SAP 服务器检索每个数据分区。

partitionOptionpartitionOnInt 为例,每个分区中的行数的计算公式为:(处于 partitionUpperBoundpartitionLowerBound 之间的总行数)/maxPartitionsNumber

若要并行加载数据分区以加快复制速度,并行程度由复制活动的 parallelCopies 设置控制。 例如,如果将 parallelCopies 设置为 4,则该服务会根据指定的分区选项和设置并行生成并运行 4 个查询,每个查询从 SAP 表检索一部分数据。 强烈建议将 maxPartitionsNumber 设为 parallelCopies 属性值的倍数。 将数据复制到基于文件的数据存储中时,还建议将数据作为多个文件写入文件夹(仅指定文件夹名称),在这种情况下,性能优于写入单个文件。

提示

默认情况下,为服务中的 SAP 表连接器启用了 BASXML

rfcTableOptions 中,可以使用以下常用 SAP 查询运算符来筛选行:

运算符 说明
EQ 等于
NE 不等于
LT 小于
LE 小于或等于
GT 大于
GE 大于或等于
IN 例如 TABCLASS IN ('TRANSP', 'INTTAB')
LIKE 例如 LIKE 'Emma%'

示例

"activities":[
    {
        "name": "CopyFromSAPTable",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<SAP table input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "SapTableSource",
                "partitionOption": "PartitionOnInt",
                "partitionSettings": {
                     "partitionColumnName": "<partition column name>",
                     "partitionUpperBound": "2000",
                     "partitionLowerBound": "1",
                     "maxPartitionsNumber": 500
                 }
            },
            "sink": {
                "type": "<sink type>"
            },
            "parallelCopies": 4
        }
    }
]

联接 SAP 表

SAP 表连接器目前仅支持单个具有默认函数模块的表。 若要获取多个表的联接数据,可以按照以下步骤利用 SAP 表连接器中的 customRfcReadTableFunctionModule 属性。

  • 编写自定义函数模块,该模块可将查询作为 OPTIONS,并应用你自己的逻辑来检索数据。
  • 对于“自定义函数模块”,请输入自定义函数模块的名称。
  • 对于“RFC 表选项”,请指定要作为 OPTIONS 提供给函数模块的表联接语句,例如“<TABLE1> INNER JOIN <TABLE2> ON COLUMN0”。

下面是一个示例:

SAP 表联接

提示

还可考虑将联接数据聚合在 VIEW 中,这受 SAP 表连接器支持。 还可尝试将相关的表提取并载入到 Azure 上(例如,Azure 存储和 Azure SQL 数据库),然后使用数据流进行进一步联接或筛选。

创建自定义函数模块

对于 SAP 表,我们目前支持复制源中的 customRfcReadTableFunctionModule 属性,这允许你利用自己的逻辑和流程数据。

作为快速入门指南,以下是开始使用“自定义函数模块”的一些要求:

  • 定义:

    定义

  • 将数据导出到下表之一:

    导出表 1

    导出表 2

以下是有关 SAP 表连接器如何与自定义函数模块一起工作的说明:

  1. 通过 SAP NCO 与 SAP 服务器建立连接。

  2. 调用“自定义函数模块”,并将参数设置如下:

    • QUERY_TABLE:在 SAP 表数据集中设置的表名称;
    • Delimiter:在 SAP 表源中设置的分隔符;
    • ROWCOUNT/Option/Fields:在表源中设置的行计数/聚合选项/字段。
  3. 获取结果并按以下方式分析数据:

    1. 分析字段表中的值以获取架构。

      分析字段中的值

    2. 获取输出表中的值,以查看哪个表包含这些值。

      获取输出表中的值

    3. 获取 OUT_TABLE 中的值,分析数据,然后将其写入接收器。

SAP 表的数据类型映射

从 SAP 表复制数据时,将使用以下从 SAP 表数据类型到服务中所用临时数据类型的映射。 若要了解复制活动如何将源架构和数据类型映射到接收器,请参阅架构和数据类型映射

SAP ABAP 类型 服务临时数据类型
C(字符串) String
I(整数) Int32
F(浮点数) Double
D(日期) String
T(时间) String
P(BCD Packed、货币、小数、数量) Decimal
N(数字) String
X(二进制和原始数据) String

Lookup 活动属性

若要了解有关属性的详细信息,请查看 Lookup 活动

后续步骤

有关复制活动支持作为源和接收器的数据存储的列表,请参阅支持的数据存储