Logic Apps加载SharePoint文件元数据至Azure SQL报错排查与方案
我在SharePoint文件夹中有一个文件,尝试通过Logic Apps获取该文件的元数据并加载到Azure SQL表中,Compose动作输出的元数据如下:
{"ItemId": 137,"Id": "%252fShared%2bDocuments%252fPOC%252fPOC1%252fPOC2%252fTemp1.xlsx","Name": "Temp1.xlsx","DisplayName": "Temp1.xlsx","Path": "/Shared Documents/POC/POC1/POC2/Temp1.xlsx","LastModified": "2024-03-03T12:17:41Z","Size": 15941,"MediaType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","IsFolder": false,"ETag": "\"{0F37F5BE-5437-4FDF-AD84-7B0B1BA19E07},2\"","FileLocator": "dataset=aHR0cHM6Ly9taWNyb3NvZnRhcGMuc2hhcmVwb2ludC5jb20vdGVhbXMvU2hhcmVwb2ludFRlc3Qy,id=JTI1MmZTaGFyZWQlMmJEb2N1bWVudHMlMjUyZlBPQyUyNTJmUE9DMSUyNTJmUE9DMiUyNTJmVGVtcDEueGxzeA=="}
使用的INSERT语句:
INSERT INTO [ado].[tblmetadata] (FileName,SourcePath,FolderName,LastModified,DestinationPath) Values ('@{body('Compose')['ItemId']}',@{body('Compose')['Name']}',@{body('Compose')['Path']}',@{body('Compose')['DisplayName']},@{body('Compose')['LastModified']}',@{body('Compose')['IsFolder']}')
执行时报错,以下是问题分析和解决方法:
问题原因
字段与值数量不匹配
INSERT子句声明了5个列,但Values里提供了6个值,SQL引擎无法匹配对应关系,直接触发语法错误。单引号语法混乱
语句中单引号配对完全错误:
@{body('Compose')['Name']}前缺少起始单引号,后却有结束单引号@{body('Compose')['DisplayName']}未用单引号包裹,直接暴露在SQL语句中- 整体单引号开闭不对应,导致SQL语法解析失败
- 数据类型不匹配
ItemId是数字类型,加单引号会强制转字符串,可能与表中字段类型冲突LastModified是UTC时间字符串,直接插入可能触发SQL datetime类型的格式校验问题IsFolder是布尔值,若表中字段为bit类型,用字符串格式的'false'会导致类型转换错误
修复后的SQL语句
假设表中字段类型对应:FileName(varchar)、SourcePath(varchar)、FolderName(varchar)、LastModified(datetime)、DestinationPath(varchar),修正后的语句:
INSERT INTO [ado].[tblmetadata] (FileName,SourcePath,FolderName,LastModified,DestinationPath) VALUES ( '@{body('Compose')['Name']}', '@{body('Compose')['Path']}', '@{split(body('Compose')['Path'], '/Temp1.xlsx')[0]}/', '@{body('Compose')['LastModified']}', '@{body('Compose')['Path']}' )
注意:
- 确保列和值的数量完全对应
- 字符串类型字段用单引号正确包裹
- 数字/布尔类型字段若对应表中是数值/bit类型,去掉单引号(如
ItemId直接写@{body('Compose')['ItemId']})
更可靠的替代方案
方案1:使用「Insert row (V2)」动作
无需手动写SQL,直接映射字段:
- 添加「Azure SQL -> Insert row (V2)」动作
- 选择目标数据库和表
[ado].[tblmetadata] - 在字段映射界面,将Compose输出的元数据拖拽到对应表字段:
- FileName →
@{body('Compose')['Name']} - SourcePath →
@{body('Compose')['Path']} - FolderName → 用
split(body('Compose')['Path'], '/')[0..sub(length(split(body('Compose')['Path'], '/')),2)]表达式截取文件夹路径 - LastModified →
@{body('Compose')['LastModified']} - DestinationPath →
@{body('Compose')['Path']}
该方式自动处理数据类型转换和SQL语法,完全避免手动编写的错误。
- FileName →
方案2:使用参数化SQL查询
避免SQL注入风险,同时保证语法正确:
- 在「Execute a SQL Query」动作中选择「使用参数」
- 查询语句写为:
INSERT INTO [ado].[tblmetadata] (FileName,SourcePath,FolderName,LastModified,DestinationPath) VALUES (@FileName, @SourcePath, @FolderName, @LastModified, @DestinationPath) - 添加对应参数:
- @FileName: 字符串类型,值为
@{body('Compose')['Name']} - @SourcePath: 字符串类型,值为
@{body('Compose')['Path']} - @FolderName: 字符串类型,值为截取后的文件夹路径
- @LastModified: datetime类型,值为
@{body('Compose')['LastModified']} - @DestinationPath: 字符串类型,值为
@{body('Compose')['Path']}
- @FileName: 字符串类型,值为
内容的提问来源于stack exchange,提问作者Hemant Kumar
相关产品推荐
相关产品推荐

