存储过程

时间:2018-01-04 09:19:44

标签: azure azure-data-factory

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

我正在使用Azure Data Factory V1。

输入数据集(内部部署Oracle源代码)

{
"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": {}
}}

输出数据集(Azure SQL数据库)

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

管道

{
"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"
}}

存储过程

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 :(得分:1)

我最近解决了完全相同的问题。 编辑复制活动引用的数据集的代码为“源”,因此其NSTimeZone.default = NSTimeZone(abbreviation: "UTC")! as TimeZone 部分包含不带模式前缀的表名。 例如:

typeProperties

此外,过程的第一个参数的名称必须与表的名称匹配,因此它应为"typeProperties": { "tableName": "DLYTRN" } 而不是@DLYTRN

答案 1 :(得分:0)

我现在无法对此进行测试,但正如在此处所述https://docs.microsoft.com/en-us/azure/data-factory/v1/data-factory-invoke-stored-procedure-from-copy-activity#stored-procedure-definition“存储过程的第一个参数的名称必须与数据集JSON中定义的tableName匹配”。

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

  • @Marketing [dbo]。[MarketingType] READONLY
  • @stringData varchar(256)

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

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

总而言之:MarketingType是表的实际名称,位于复制活动的SqlWriterTableType属性,而Marketing是存储过程中参数的名称,输出中的表名的名称数据集。

希望这有帮助!