Azure数据工厂获取元数据以获取Blob文件名并将其传输到Azure SQL数据库表

问题描述

我试图在Azure数据工厂中使用“获取元数据”活动以获取blob文件名并将其复制到Azure sql数据库表中。 我遵循本教程:https://www.mssqltips.com/sqlservertip/6246/azure-data-factory-get-metadata-example/

这是我的管道,“复制数据”>“源”是我的Blob存储中的Blob文件的源目标。我需要将源文件指定为二进制文件,因为它们是* .jpeg文件

GetMetadata0

对于我的“复制数据”>“接收器”(其Azure sql数据库),我启用了“自动创建表”选项

GetMetadata1

在我的Sink数据集配置中,我必须选择一个表,因为如果我不选择sql数据库中的表,即使该表与所需的Blob文件名根本不相关,验证也不会通过得到。

GetMetadata2

问题1:我是否应该在sql DB中创建一个新表,然后使列与要提取的blob文件名匹配?

然后,我尝试验证管道,但出现此错误

copy_Data_1
Sink must be binary when source is binary dataset.

Getmetadata3

问题2:如何解决错误?我必须选择源文件文件类型为二进制,因为这是创建源数据集时的步骤之一。因此,当我选择Azure sql表的接收器数据集时,不必选择数据集的类型,因此看起来似乎不匹配。

非常感谢您。

新管道的新屏幕截图,我现在可以在json输出文件获取文件名的itemName。

GetFileName1

现在,我在Get_File_Name2活动之后添加“复制数据”活动,并将它们连接在一起,以尝试获取json输出文件作为源数据集。

GetFileName2

但是,我需要先选择源数据集位置,然后再将类型指定为json。但是,据我了解,这些输出json文件是Get_File_Name2活动的输出,它们尚未存储在Blob存储中。如何使复制数据活动读取这些json输出文件作为源数据集?

GetFileName3

更新10/14/2020 这是我的新活动存储过程,我按建议添加了参数,但是由于存储过程需要此参数,因此将名称更改为JsonData。

storedprocedure1

这是我的存储过程。

storedprocedure2

在存储过程中出现此错误

{
    "errorCode": "2402","message": "Execution fail against sql server. sql error number: 13609. Error Message: JSON text is not properly formatted. Unexpected character 'S' is found at position 0.","failureType": "UserError","target": "Stored procedure1","details": []
}

storedprocedure3

但是当我检查输入时,似乎已经成功读取了json字符串itemName。

storedprocedure4

但是,当我检查输出时,它不存在。

storedprocedure5

解决方法

实际上,您可以使用获取元数据输出json作为参数,然后调用存储过程:Get metedata-> Stored Procedure

您只需要关注存储过程的编码即可。

获取元数据输出childitems

{
   "childItems": [
        {
            "name": "DeploymentFiles.zip","type": "File"
        },{
            "name": "geodatalake.pdf",{
            "name": "test2.xlsx",{
            "name": "word.csv","type": "File"
        }
}

存储过程:

@activity('Get Metadata1').output.childitems

enter image description here

关于如何创建存储过程(从json对象获取数据),您可以参考此博客:Retrieve JSON Data from SQL Server using a Stored Procedure