【发布时间】:2020-08-15 22:30:22
【问题描述】:
我正在创建一个临时表#ua_temp,它是常规表的子集。我没有收到错误,但是当我在第二步中尝试从 #ua_temp 进行 SELECT 时,找不到它。如果我删除 #,则会创建一个名为 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 仅用于调试目的;不影响问题。
【问题讨论】:
-
运行 SQL Server Profiler,有一个列 SPID。如果这两个语句具有不同的 SPID,那么您就知道这是一个范围问题。
-
客户端进程ID相同,SPID相同。
-
能否将文本从跟踪中复制出来并在 management studio 中运行这两个语句?
-
我将它们复制到 Sql 查询分析器中。第一个没有错误,但没有创建表,所以第二个被炸毁了。它与##global_temp 一起工作正常。
-
好像是create步骤的问题,我试着把第一个命令的SqlParameters去掉,程序运行OK了。
标签: c# sql-server