我正在创建一个临时表 #ua_temp,它是常规表的一个子集。我没有收到错误,但是当我在第二步尝试从 #ua_temp 中选择时,找不到它。如果我删除 #,则会创建一个名为 ua_temp 的表。
我使用了与在其他地方使用 SELECT INTO 创建表完全相同的技术。它运行良好,所以我认为它与数据库设置没有任何关系。谁能看出问题所在?
// Create temporary table
q = new StringBuilder(200);
q.Append("select policy_no, name, amt_due, due_date, hic, grp, eff_dt, lis_prem, lis_grp, lis_co_pay_lvl, ");
q.Append("lep_prem, lapsed, dn_code, [filename], created_dt, created_by ");
q.Append("into #ua_temp from elig_ua_response ");
q.Append("where [filename] = @fn1 or [filename] = @fn2 ");
sc = new SqlCommand(q.ToString(), db);
sc.Parameters.Add(new SqlParameter("@fn1", sFn));
sc.Parameters.Add(new SqlParameter("@fn2", sFn2));
int r = sc.ExecuteNonQuery();
MessageBox.Show(r.ToString() + " rows");
// Rosters
q = new StringBuilder(200);
q.Append("select policy_no,name,amt_due,due_date,hic,grp,eff_dt,");
q.Append("lis_prem,lis_grp,lis_co_pay_lvl,lep_prem,lapsed,dn_code,[filename] ");
q.Append("from #ua_temp where (lis_prem > 0.00 or lep_prem > 0.00) ");
q.Append("and [filename] = @fn order by name");
sc.CommandText = q.ToString();
sc.Parameters.Clear();
sc.Parameters.Add(new SqlParameter("@fn", sFn));
sda = new SqlDataAdapter(sc);
sda.Fill(ds, "LIS LEP Roster");
回答一些明显的问题:该程序使用源表 elig_ua_response 运行良好。引入临时表的原因是我想删除这个特定报告的一些行。我在测试时将 [filename] 列放在方括号中,以确保它不是关键字问题。如果将 #ua_temp 替换为 elig_ua_response,则第二个 SELECT 可以正常工作。我为临时表尝试了不同的名称。显示行数的 MessageBox 仅用于调试目的;它不会影响问题。
最佳答案
Joe Zack 的评论帮助我理解了这里发生的事情。一个非常清晰简洁的解释。这应该是一个答案,以便通过谷歌搜索到达这里的人更容易看到。
SqlCommand calls sql with parameters via sp_executesql when there are parameters, which means your temp table gets created inside (and then clean up in) a stored procedure so it's not available to future calls - even when they share the same connection
关于c# - Sql Server临时表消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6629582/