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

通过ODBC连接Snowflake时IDataReader无法读取临时表问题

问题原因与解决方案

这个问题不属于Snowflake ODBC驱动的技术限制,基本都是操作层面的会话、上下文不匹配导致的,常见原因和修复方案如下:

1. 会话不匹配(最常见原因)

Snowflake的所有临时表都是会话级可见,仅在创建该表的会话中可访问,每一个新开的ODBC连接对应Snowflake的一个独立会话:

  • 如果你创建临时表和查询INFORMATION_SCHEMA使用的是不同的连接对象、或者中间关闭再重开了连接,新会话无法访问旧会话创建的临时表,自然查询返回为空。

2. 数据库上下文不匹配

你查询时指定了DB1.INFORMATION_SCHEMA.TABLES,临时表会默认创建在会话当前激活的数据库下:

  • 如果建表时会话的默认数据库不是DB1,临时表会被创建到其他数据库下,查DB1的系统视图自然找不到。
  • 修复方法:建表时指定完整的库路径,例如CREATE TEMPORARY TABLE DB1.PUBLIC.TEMPTABLE1 (ID INT);,确保表创建在你要查询的DB1下。

3. 查询条件冗余

Snowflake的INFORMATION_SCHEMA.TABLES系统视图中,所有临时表(包括本地、全局临时表)的TABLE_TYPE字段固定为TEMPORARY,你加的LOCAL TEMPORARY/VOLATILE等过滤条件在Snowflake中不会命中任何记录,不过不会导致已存在的临时表查不到,可以简化查询语句降低出错概率:

string query = "SELECT TABLE_NAME FROM DB1.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TEMPORARY'";

正确可运行的参考代码

using (var conn = new OdbcConnection("你的Snowflake ODBC连接串"))
{
    conn.Open();
    // 同一会话下先建临时表
    conn.Execute("CREATE TEMPORARY TABLE DB1.PUBLIC.TEMPTABLE1 (ID INT);");
    // 同一会话下查询系统表
    string query = "SELECT * FROM DB1.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TEMPORARY'";
    using (IDataReader reader = conn.ExecuteReader(query))
    {
        while (reader.Read()) 
        {
            // 此处可正常读到临时表的元数据
            Console.WriteLine(reader["TABLE_NAME"].ToString());
        }
    }
}

注意:

  1. 你示例代码中的sting为拼写笔误,实际代码需修正为string,否则会出现编译错误。
  2. 如果你用的是Dapper类库的Query方法,确认该方法没有隐式创建新连接,必须复用同一个已打开的连接对象才能读到临时表。

内容的提问来源于stack exchange,提问作者archgnu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:54:07