Azure Synapse专用SQL池执行脚本遇FOR语法解析错误求助
解决方案:Azure Synapse专用SQL池替代
FOR JSON AUTO语法 错误原因
Azure Synapse专用SQL池(Dedicated SQL Pool)的T-SQL支持子集不包含FOR JSON系列语法,而无服务器SQL池(Serverless Pool)基于更完整的T-SQL实现,因此可以正常运行原脚本。
替代方案
使用STRING_AGG函数手动拼接JSON格式的字符串,模拟FOR JSON AUTO的输出效果,具体修改如下:
修改后的动态SQL代码
将原脚本中定义@ColumnMetadataSQL的部分替换为:
SET @ColumnMetadataSQL = 'SET @ColumnMetadataOUT = ISNULL(''['' + STRING_AGG( ''{"TABLE_SCHEMA":"'' + REPLACE(TABLE_SCHEMA, ''"'', ''\"'') + ''",'' + ''"TABLE_NAME":"'' + REPLACE(TABLE_NAME, ''"'', ''\"'') + ''",'' + ''"COLUMN_NAME":"'' + REPLACE(COLUMN_NAME, ''"'', ''\"'') + ''",'' + ''"ORDINAL_POSITION":'' + CAST(ORDINAL_POSITION AS VARCHAR(10)) + '','' + ''"DATA_TYPE":"'' + REPLACE(DATA_TYPE, ''"'', ''\"'') + ''"}'', '','' ) + '']'', ''[]'''')' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ''dbo'' AND TABLE_NAME NOT IN (''OptionsetMetadata'', ''GlobalOptionsetMetadata'',''StateMetadata'',''StatusMetadata'', ''TargetMetadata'') AND TABLE_NAME LIKE ''%' + @BaseTableSuffix + ''''
关键说明
- 转义处理:用
REPLACE函数将列值中的双引号替换为转义双引号(\"),避免JSON格式错误。 - 空结果集处理:用
ISNULL函数确保当没有匹配的列元数据时,生成有效的空JSON数组[],而非NULL。 - 兼容性:
STRING_AGG是专用SQL池支持的函数(要求数据库兼容级别≥130,Azure Synapse默认满足),可以安全使用。
验证方法
将@PreviewOnly设为1,执行脚本后查看@ColumnMetadata的内容,确认生成的JSON格式与原脚本在无服务器池中生成的一致,再切换为0创建视图。
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

