Azure Synapse复制Parquet数据时提示'FORMAT'附近语法错误
问题背景
在Azure Synapse中执行数据复制任务,目标是将Parquet格式源数据做字段转换后加载至专用SQL池表,运行时触发如下报错:
目标“Move InvItemDist to DP”操作失败:故障发生在'Source'端。
ErrorCode=SqlOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=数据库操作失败,返回错误:'Incorrect syntax near 'FORMAT'.',Source=,''Type=System.Data.SqlClient.SqlException,Message=Incorrect syntax near 'FORMAT'.,Source=.Net SqlClient Data Provider,SqlErrorNumber=102,Class=15,ErrorCode=-2146232060,State=1,Errors=[{Class=15,Number=102,State=1,Message=Incorrect syntax near 'FORMAT'.,},],'
故障触发时使用的源查询SQL如下:
SELECT A.[NDC] , A.[ProductID] , A.[Customer_Site] , A.[ZipFileName] FROM ( SELECT DISTINCT [NDC] , [ProductID] , [Customer_Site] , LEFT ( SUBSTRING([ZipFileName], NULLIF(CHARINDEX('-', [ZipFileName], NULLIF(CHARINDEX('-', [ZipFileName]), 0) + 1), 0) + 1, LEN([ZipFileName])) , LEN(SUBSTRING([ZipFileName], NULLIF(CHARINDEX('-', [ZipFileName], NULLIF(CHARINDEX('-', [ZipFileName]), 0) + 1), 0) + 1, LEN([ZipFileName]))) - 4 ) AS [ZileFileOrder] , [ZipFileName] , ROW_NUMBER() OVER (PARTITION BY [NDC], [ProductID], [Customer_Site] ORDER BY LEFT ( SUBSTRING([ZipFileName], NULLIF(CHARINDEX('-', [ZipFileName], NULLIF(CHARINDEX('-', [ZipFileName]), 0) + 1), 0) + 1, LEN([ZipFileName])) , LEN(SUBSTRING([ZipFileName], NULLIF(CHARINDEX('-', [ZipFileName], NULLIF(CHARINDEX('-', [ZipFileName]), 0) + 1), 0) + 1, LEN([ZipFileName]))) - 4 ) DESC) AS UN FROM OPENROWSET( BULK 'https://stonexiacctolleson3154ba.dfs.core.windows.net/fs-tolleson/InvItemDist - Fact/2022/06/15/*.parquet', FORMAT = 'PARQUET' ) AS [result] ) AS A WHERE A.[UN] = 1
故障根因
报错核心是SQL执行引擎和语法不匹配:
- 你写的带
FORMAT = 'PARQUET'参数的OPENROWSET语法,是*Azure Synapse无服务器SQL池(Serverless SQL Pool)*专属的原生语法,仅在无服务器SQL池环境下可被解析执行,用于直接读取ADLS Gen2存储上的Parquet/CSV/Delta Lake格式文件。 - 当前复制任务的源端查询实际提交到了*专用SQL池(Dedicated SQL Pool)*执行,专用SQL池的T-SQL解析器不识别OPENROWSET语法中的
FORMAT关键字,直接抛出102号语法错误。
修复方案
可根据实际架构选择以下任意一种方案修复:
- 调整复制活动源端连接配置:将源查询的执行环境从专用SQL池切换为无服务器SQL池端点,提前给无服务器SQL池配置目标ADLS Gen2存储的访问权限(支持托管身份、SAS令牌、存储账户密钥三种授权方式,给对应身份分配存储Blob数据读取/参与者权限即可),原有SQL代码无需修改即可正常执行,查询结果可直接作为复制源写入目标专用表。
- 保留专用SQL池作为执行环境:放弃直接用OPENROWSET读取Parquet的写法,两种实现路径可选:
- 将复制活动源类型直接配置为Parquet格式,指向ADLS Gen2上的对应文件路径,字段截取、分组去重、取Top1记录的转换逻辑放在复制活动的映射转换/数据流环节完成,无需写SQL读文件。
- 在专用SQL池中创建指向ADLS Parquet路径的外部表(指定格式为Parquet),将原有SQL中
OPENROWSET部分替换为对该外部表的查询,逻辑无需调整即可在专用SQL池内执行。
- 校验管道配置:如果是在Synapse管道内配置的复制活动,检查源端的链接服务配置,确认没有把自定义SQL查询错误关联到专用SQL池的连接上,避免语法提交到不兼容的引擎执行。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

