首页 文章

Azure数据工厂复制活动与存储过程

提问于
浏览
0

是否有一个解决方法,您需要将输入数据集中的属性“tableName”命名为存储过程的第一个参数(包含表类型的参数)?

我使用Azure Data Factory V1 .

Input dataset (On-premise Oracle source)

{
"name": "DS-ORA-WMS-CDC-DLYTRN",
"properties": {
    "published": false,
    "type": "OracleTable",
    "linkedServiceName": "LS-ORA-WMS-CDC",
    "typeProperties": {
        "tableName": "WMST.DLYTRN"
    },
    "availability": {
        "frequency": "Hour",
        "interval": 1
    },
    "external": true,
    "policy": {}
}}

Output dataset (Azure SQL database)

{
"name": "DS-ASQL-ANALYTICS-DLYTRN",
"properties": {
    "published": false,
    "type": "AzureSqlTable",
    "linkedServiceName": "LS-SQL-ANALYTICS-DB",
    "typeProperties": {
        "tableName": "wms.DLYTRN"
    },
    "availability": {
        "frequency": "Hour",
        "interval": 1
    }
}}

Pipeline

{
"name": "test",
"properties": {
    "description": "test pipeline",
    "activities": [
        {
            "type": "Copy",
            "typeProperties": {
                "source": {
                    "type": "OracleSource",
                    "oracleReaderQuery": "select * from WMST.DLYTRN"
                },
                "sink": {
                    "type": "SqlSink",
                    "sqlWriterStoredProcedureName": "wms.spPersistDlytrn",
                    "storedProcedureParameters": {
                        "srcdc": {
                            "value": "CDC"
                        }
                    },
                    "sqlWriterTableType": "wms.DLYTRNType",
                    "writeBatchSize": 0,
                    "writeBatchTimeout": "00:00:00"
                }
            },
            "inputs": [
                {
                    "name": "DS-ORA-WMS-CDC-DLYTRN"
                }
            ],
            "outputs": [
                {
                    "name": "DS-ASQL-ANALYTICS-DLYTRN"
                }
            ],
            "policy": {
                "timeout": "1.00:00:00",
                "concurrency": 1,
                "retry": 3
            },
            "scheduler": {
                "frequency": "Hour",
                "interval": 1
            },
            "name": "TestWMSCopyWithSproc"
        }
    ],
    "start": "2018-01-04T07:00:00Z",
    "end": "2018-01-08T00:00:00Z",
    "isPaused": false,
    "hubName": "hub",
    "pipelineMode": "Scheduled"
}}

Stored procedure

CREATE PROCEDURE [wms].[spPersistDlytrn]
   @DLYTRNTable [wms].[DLYTRNType] READONLY,
   @srcdc VARCHAR(4)
AS
...
RETURN 0

运行活动时,它返回以下错误消息:

服务器上的数据库操作失败:Sink:tcp:someservername.database.windows.net,1433',SQL错误号为'349' . 来自数据库执行的错误消息:过程“spPersistDlytrn”没有名为“@wms.DLYTRN”的参数 .

由于无法命名存储过程参数“wms.DLYTRN”,有没有办法排除模式前缀?

2 回答

  • 0

    我最近解决了同样的问题 . 编辑复制活动引用的数据集的代码为"Source",因此其 typeProperties 部分包含没有架构前缀的表名 . 例如:

    "typeProperties": {
        "tableName": "DLYTRN"
    }
    

    此外,过程的第一个参数的名称必须与表的名称匹配,因此它应该是 @DLYTRN 而不是 @DLYTRNTable .

  • 1

    我现在无法测试,但正如在这里所说https://docs.microsoft.com/en-us/azure/data-factory/v1/data-factory-invoke-stored-procedure-from-copy-activity#stored-procedure-definition "The name of the first parameter of stored procedure must match the tableName defined in the dataset JSON" .

    在示例中,它在sp中声明了两个参数:

    • @Marketing [dbo] . [MarketingType] READONLY

    • @stringData varchar(256)

    在数据集中它不使用模式前缀,它只是说:“tableName”:“Marketing”,没有模式(尝试这个,因为你在输出数据集定义中有模式) .

    然后在管道中,它只为stringData提供值 . 另外这个:“SqlWriterTableType”:“MarketingType”,看到它没有架构前缀,你的管道定义确实有它 .

    总结一下:MarketingType是表的实际名称,位于复制活动的SqlWriterTableType属性中,而Marketing是存储过程中参数的名称,以及输出数据集中表名的名称 .

    希望这可以帮助!

相关问题