问题描述
我试图在Azure数据工厂中使用“获取元数据”活动以获取blob文件名并将其复制到Azure sql数据库表中。 我遵循本教程:https://www.mssqltips.com/sqlservertip/6246/azure-data-factory-get-metadata-example/
这是我的管道,“复制数据”>“源”是我的Blob存储中的Blob文件的源目标。我需要将源文件指定为二进制文件,因为它们是* .jpeg文件。
对于我的“复制数据”>“接收器”(其Azure sql数据库),我启用了“自动创建表”选项
在我的Sink数据集配置中,我必须选择一个表,因为如果我不选择sql数据库中的表,即使该表与所需的Blob文件名根本不相关,验证也不会通过得到。
问题1:我是否应该在sql DB中创建一个新表,然后使列与要提取的blob文件名匹配?
然后,我尝试验证管道,但出现此错误。
copy_Data_1
Sink must be binary when source is binary dataset.
问题2:如何解决此错误?我必须选择源文件的文件类型为二进制,因为这是创建源数据集时的步骤之一。因此,当我选择Azure sql表的接收器数据集时,不必选择数据集的类型,因此看起来似乎不匹配。
非常感谢您。
新管道的新屏幕截图,我现在可以在json输出文件中获取文件名的itemName。
现在,我在Get_File_Name2活动之后添加“复制数据”活动,并将它们连接在一起,以尝试获取json输出文件作为源数据集。
但是,我需要先选择源数据集位置,然后再将类型指定为json。但是,据我了解,这些输出json文件是Get_File_Name2活动的输出,它们尚未存储在Blob存储中。如何使复制数据活动读取这些json输出文件作为源数据集?
更新10/14/2020 这是我的新活动存储过程,我按建议添加了参数,但是由于存储过程需要此参数,因此将名称更改为JsonData。
这是我的存储过程。
在存储过程中出现此错误:
{
"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": []
}
但是当我检查输入时,似乎已经成功读取了json字符串itemName。
但是,当我检查输出时,它不存在。
解决方法
实际上,您可以使用获取元数据输出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
关于如何创建存储过程(从json对象获取数据),您可以参考此博客:Retrieve JSON Data from SQL Server using a Stored Procedure。