【问题标题】:ADF push json data to SQLADF 将 json 数据推送到 SQL
【发布时间】:2024-05-18 14:15:01
【问题描述】:

我有一个 adf 管道来从 API 获取数据并将其作为 json 存储到 blob 存储中。接下来,我使用查找从 blob 中获取相同的 json 数据。使用 foreach 和 filter 我在过滤的 json 中得到了一些特定的内容。现在我需要将此过滤后的数据插入数据库。有没有办法将过滤后的数据复制到数据库中?

【问题讨论】:

    标签: azure-data-factory azure-data-factory-2


    【解决方案1】:

    更新:

    如果我们输入json数组也是同样的过程。如下图:

    我的输入是[{\"customerId\":100001,\"cutomerName\":\"Tom\"},{\"customerId\":100002,\"cutomerName\":\"John\"},{\"customerId\":100003,\"cutomerName\":\"Tinny\"}],我可以在我的 Azure SQL 中看到 3 条记录。


    这里我使用 Lookup 活动来获取一个 json 对象并通过存储过程活动将其复制到 Azure SQL 中。

    1. 这是我的查找活动的 json 类型输出。
        "firstRow": {
            "customerId": 100001,
            "cutomerName": "Tom"
        }
    

    1. 在 azure sql 中,我们可以创建表和存储过程。
    --1. create table
    create table dbo.CustomerInfo(
    customerId INT,
    cutomerName varchar(50)
    )
    
    --2. create stored procedure
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    CREATE PROCEDURE [dbo].[uspCustomerInfo] @json NVARCHAR(MAX)
    AS 
    begin
        INSERT INTO dbo.CustomerInfo(customerId,cutomerName) 
            SELECT customerId,cutomerName
            FROM OPENJSON(@json,N'$')
                WITH (
                customerId INT N'$.customerId',
                cutomerName VARCHAR(255) N'$.cutomerName'
                );
    end
    
    1. 在存储过程活动设置中,我们应该通过@string(activity('Lookup1').output.firstRow)将json转换为字符串。

    2. 这是我对存储过程活动的输入。

    3. 这是我的调试结果:

    4. 如果您面临更复杂的 json 对象,可以参考此doc

    【讨论】:

    • 这太棒了。谢谢它工作。我在这里有一个查询,即使我想要的是成功,总体而言,此活动失败并出现错误“指定的存储过程无效。这可能是由于存储过程不返回任何数据造成的”。你能帮我避免这种情况并使这项活动取得成功吗?
    • 如果我有这样的多个对象,我们应该如何处理: [ { "customerId": 100001, "cutomerName": "Tom" }, { "customerId": 100002, "cutomerName": “汤姆1”}]
    • 嗨@ARUN VARRIAR。如果我们输入 json 数组也是同样的过程。我已经更新了我的答案。 The specified Stored Procedure is not valid...的问题你解决了吗?您是否使用存储过程活动?或者您可以发布此问题。
    • 错误:“源”端发生故障。 ErrorCode=SqlInvalidDbStoredProcedure,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=指定的存储过程无效。这可能是由于存储过程没有返回任何数据造成的。存储过程脚本无效:'[dbo].[TestProc]'.,Source=Microsoft.DataTransfer.ClientLibrary。也不确定,当我提供原始 json 时,上述步骤可以完美运行。但是当我给@string(activity('Filter1').output.value) 时,它只复制第一行值
    • 嗨@joseph xu 我已经解决了所有其他问题。但仍然无法解决此问题:错误:“源”端发生故障。 ErrorCode=SqlInvalidDbStoredProcedure,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=指定的存储过程无效。这可能是由于存储过程没有返回任何数据造成的。存储过程脚本无效:'[dbo].[TestProc]'.,Source=Microsoft.DataTransfer.ClientLibrary