Synapse无服务器SQL中文件不存在时如何调用替代文件?
问题原因
Synapse无服务器SQL中,OPENROWSET指定的文件不存在时触发的是编译阶段错误,而TRY/CATCH仅能捕获运行时错误,因此你的原始写法无法触发CATCH块执行备选查询。
解决方案:使用动态SQL
通过动态SQL将OPENROWSET查询延迟到运行时执行,此时文件不存在的错误会变为运行时错误,可被TRY/CATCH捕获。
基础实现
BEGIN TRY -- 尝试查询目标文件 EXEC sp_executesql N' SELECT * FROM OPENROWSET( BULK ''https://dls001dev.dfs.core.windows.net/published/test/year=2023/month=05/test05.parquet'', FORMAT = ''PARQUET'' ) AS [result]' END TRY BEGIN CATCH -- 目标文件不存在时,查询备选文件 EXEC sp_executesql N' SELECT * FROM OPENROWSET( BULK ''https://dls001dev.dfs.core.windows.net/published/test/year=2023/month=04/test04.parquet'', FORMAT = ''PARQUET'' ) AS [result]' END CATCH
优化:仅处理文件不存在的错误
如果需要仅在文件不存在时切换,而非捕获所有错误,可以在CATCH块中判断错误编号:
BEGIN TRY EXEC sp_executesql N' SELECT * FROM OPENROWSET( BULK ''https://dls001dev.dfs.core.windows.net/published/test/year=2023/month=05/test05.parquet'', FORMAT = ''PARQUET'' ) AS [result]' END TRY BEGIN CATCH -- 先打印错误编号确认(首次执行后可删除) -- PRINT ERROR_NUMBER(); -- PRINT ERROR_MESSAGE(); -- 替换为你的文件不存在对应的错误编号,示例为46010(需实际验证) IF ERROR_NUMBER() = 46010 EXEC sp_executesql N' SELECT * FROM OPENROWSET( BULK ''https://dls001dev.dfs.core.windows.net/published/test/year=2023/month=04/test04.parquet'', FORMAT = ''PARQUET'' ) AS [result]' ELSE -- 其他错误直接抛出 THROW; END CATCH
注意事项
- 动态SQL中的单引号需用双单引号转义,避免语法错误。
- 确保Synapse无服务器SQL具备访问存储账户的权限(如SAS密钥、托管身份),否则即使文件存在也会触发权限错误。
- 可先执行带错误打印的
CATCH块,获取文件不存在对应的具体错误编号,再替换到条件判断中。
内容的提问来源于stack exchange,提问作者user19504539
相关产品推荐
相关产品推荐

