是否有一个解决方法,您需要将输入数据集中的属性“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”,有没有办法排除模式前缀?
答案 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中声明了两个参数:
在数据集中它不使用模式前缀,它只是说:“tableName”:“Marketing”,没有模式(尝试这个,因为你在输出数据集定义中有模式)。
然后在管道中,它只为stringData提供值。另外这个:“SqlWriterTableType”:“MarketingType”,看到它没有架构前缀,你的管道定义确实有它。
总而言之:MarketingType是表的实际名称,位于复制活动的SqlWriterTableType属性,而Marketing是存储过程中参数的名称,输出中的表名的名称数据集。
希望这有帮助!