[英]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中聲明了兩個參數:
在數據集上,它不使用模式前綴,只是說:“ tableName”:“ Marketing”,不帶模式(嘗試此操作,因為輸出數據集定義中具有模式)。
然后,在管道中,它只是為stringData提供值。 還可以這樣:“ SqlWriterTableType”:“ MarketingType”,請注意它沒有架構前綴,而您的管道定義也有它。
綜上所述:MarketingType是表的實際名稱,位於復制活動的SqlWriterTableType屬性中,而Marketing是存儲過程中的參數名稱,以及輸出數據集中的表名。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.