在我的程序中,我想在tempDB
中选择一些bookID,以便稍后查询(使用Dapper扩展名):
using (var conn = new SqlConnection(connStr)) {
conn.Execute("SELECT bookID INTO #tempdb WHERE ... FROM Books");
int count = conn.ExecuteScalar<int>("SELECT COUNT(*) FROM #tempdb");
var authors = conn.Query("SELECT * FROM #tempdb LEFT JOIN BookAuthors ON ...");
}
然而,当我执行页面时,我得到以下异常:
无效的对象名称&#39;#tempdb&#39;。
#tempdb
的生命周期似乎只在第一次查询中有效?
答案 0 :(得分:3)
看起来你正在使用隐式连接打开/关闭。这确实会导致瞬态对象出现问题。如果在查询之间需要临时表,则需要在执行任何此类查询之前手动打开连接。这应该可以正常工作,测试套件中的许多示例都会使用临时表。
但是,从实际的角度来看,利用临时表在查询之间传递状态是......尴尬。除了脆弱之外,它对计划缓存也不利,因为#foo
在不同连接上的所有使用之间具有不同的含义(包括重置但重用的连接)。
答案 1 :(得分:0)
我找到了一张前一张海报,他遇到了同样的问题和他的解决方案。
帖子表明你必须首先在SQL中显式地“创建表#tempdb”,一切都很顺利。即使是海报自己也不知道为什么这种编码风格有效。