通过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()); } } }
注意:
- 你示例代码中的
sting为拼写笔误,实际代码需修正为string,否则会出现编译错误。- 如果你用的是Dapper类库的
Query方法,确认该方法没有隐式创建新连接,必须复用同一个已打开的连接对象才能读到临时表。
内容的提问来源于stack exchange,提问作者archgnu
相关产品推荐
相关产品推荐

