簡體   English   中英

帶有存儲過程的Azure Data Factory復制活動

[英]Azure Data Factory copy activity with stored procedure

您是否需要將存儲過程的第一個參數(包含表類型的第一個參數)精確命名為輸入數據集中的屬性“ tableName”,是否存在變通方法?

我正在使用Azure數據工廠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”,有沒有辦法排除模式前綴?

我最近解決了完全相同的問題。 您的復制活動引用的數據集的編輯代碼稱為“源”,因此其typeProperties部分包含不帶模式前綴的表名。 例如:

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

另外,過程的第一個參數的名稱必須與表的名稱匹配,因此它應為@DLYTRN而不是@DLYTRNTable

我現在無法對此進行測試,但是正如這里所說的https://docs.microsoft.com/zh-cn/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是存儲過程中的參數名稱,以及輸出數據集中的表名。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM