使用 ADF 调用存储过程

Posted

技术标签:

【中文标题】使用 ADF 调用存储过程【英文标题】:Call stored procedure using ADF 【发布时间】:2017-01-10 12:43:20 【问题描述】:

我正在使用 ADF 加载 SQL 服务器表,插入结束后,我必须使用以下方法进行少量操作

    触发器(插入后) - 失败,SQL 服务器无法检测到我使用 ADF 推送的插入记录。**Seems to be a bug**

    使用用户定义表类型的存储过程 - 出现错误

错误号“156”。来自数据库执行的错误消息:不正确 关键字“选择”附近的语法。必须声明表变量 “@a”。

我在管道下面创建了


    "name": "CopyPipeline-xxx",
    "properties": 
        "activities": [
            
                "type": "Copy",
                "typeProperties": 
                    "source": 
                        "type": "AzureDataLakeStoreSource",
                        "recursive": false
                    ,
                    "sink": 
                        "type": "SqlSink",
                        "sqlWriterStoredProcedureName": "sp_xxx",
                        "storedProcedureParameters": 
                            "stringProductData": 
                                "value": "str1"
                            
                        ,
                        "writeBatchSize": 0,
                        "writeBatchTimeout": "00:00:00"
                    ,
                    "translator": 
                        "type": "TabularTranslator",
                        "columnMappings": "col1:col1,col2:col2"
                    
                ,
                "inputs": [
                    
                        "name": "InputDataset-3jg"
                    
                ],
                "outputs": [
                    
                        "name": "OutputDataset-3jg"
                    
                ],
                "policy": 
                    "timeout": "1.00:00:00",
                    "concurrency": 1,
                    "executionPriorityOrder": "NewestFirst",
                    "style": "StartOfInterval",
                    "retry": 3,
                    "longRetry": 0,
                    "longRetryInterval": "00:00:00"
                ,
                "scheduler": 
                    "frequency": "Hour",
                    "interval": 8
                ,
                "name": "Activity-0-xxx_csv->[dbo]_[xxx_staging]"
            
        ],
        "start": "2017-01-09T21:48:53.348Z",
        "end": "2099-12-30T18:30:00Z",
        "isPaused": false,
        "hubName": "hub",
        "pipelineMode": "Scheduled"
    

并使用下面的存储过程

create procedure [dbo].[sp_xxx] @xxx1 [dbo].[ut_xxx] READONLY, @str1 varchar(100) AS

MERGE xxx_dummy AS a
USING @xxx1 AS b
ON (a.col1 = b.col1) 
WHEN NOT MATCHED 
    THEN INSERT(col1, col2) 
    VALUES(b.col1, b.col2)
WHEN MATCHED 
    THEN UPDATE SET a.col2 = b.col2;

请帮我解决问题。

【问题讨论】:

带有@a 的脚本在哪里 - 脚本的一部分在哪里出错。并在使用前声明? 【参考方案1】:

我可以重现您的第一个错误。使用 Azure 数据工厂 (ADF) 插入 SQL Server 表似乎使用批量插入方法(类似于 BULK INSERT、bcp、SSIS 等),默认情况下,这些方法不会触发触发器:

insert bulk [dbo].[testADF] ([col1] Int, [col2] Int, [col3] Int, [col4] Int) 
with (TABLOCK, CHECK_CONSTRAINTS)

使用 bcp,BULK INSERT 可以更改为“触发触发”的标志,但似乎无法更改 ADF 的此设置。作为一种解决方法,将触发器中的逻辑移动到存储过程中。

如果您认为此标志很重要,请考虑创建feedback item。

【讨论】:

以上是关于使用 ADF 调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE ADF11g:存储过程传入数据库对象

ORACLE ADF11g: AM 代码返回存储过程数据库对象数组

ORACLE ADF11g:AM 存储过程传入数据库对象数组

sql server实现copy data功能的存储过程(公共代码)

Oracle如何创建存储过程和如何调用存储过程

VB调用SQL存储过程异步执行问题