You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:05:31