Azure Synapse专用SQL池执行ISJSON函数报AS关键字附近语法错误
问题根因
你当前使用的2022年6月发布的10.0.15661.0版本Azure Synapse专用SQL池,并未正式原生支持ISJSON函数。
微软官方文档中关于ISJSON的Synapse支持说明存在范围歧义:早期文档标注的支持仅覆盖无服务器SQL池,专用SQL池对ISJSON的原生支持是2022年下半年才通过补丁逐步推送的,你所用的版本刚好卡在功能正式上线前的节点,SQL解析器无法识别ISJSON为内置函数,解析过程语法错位才会抛出"关键字'AS'附近有语法错误"的提示,这也能解释同环境下更早落地支持的OPENJSON可以正常运行。
可用解决方案
方案1:临时兼容(无需升级版本)
利用当前环境已支持的OPENJSON自定义标量函数,实现和原生ISJSON完全一致的判断逻辑:
CREATE FUNCTION dbo.ISJSON_CUSTOM(@input NVARCHAR(MAX)) RETURNS BIT AS BEGIN DECLARE @valid BIT = 0 BEGIN TRY -- 传入内容可被OPENJSON正常解析即为合法JSON SELECT TOP 1 @valid = 1 FROM OPENJSON(@input) END TRY BEGIN CATCH SET @valid = 0 END CATCH RETURN @valid END
使用时将原代码中的ISJSON(字段名/JSON字符串)替换为dbo.ISJSON_CUSTOM(字段名/JSON字符串)即可,判断逻辑和返回值规则和原生函数完全一致,不会改动原有业务判断逻辑。
方案2:原生功能启用(根治方案)
将当前专用SQL池实例升级到2022年下半年之后发布的稳定版本即可直接使用原生ISJSON,你可以在Synapse工作区的专用池管理页触发版本更新,若后台未提供自助更新入口,可提交Azure支持工单申请将实例刷到最新的兼容版本,升级后无需任何代码改动即可正常运行你原来的SQL语句。
踩坑提示
- 不要尝试通过调整数据库兼容级别解决该问题,该问题属于内置函数未随版本落地,和兼容级别配置无关
- 自定义函数实现的JSON校验逻辑对JSON数组、JSON对象、嵌套JSON的判断结果和原生
ISJSON完全一致,性能差异在常规数据量场景下可忽略
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

