C# ExecuteOnQuery()无法创建临时表SqlServer

C# ExecuteOnQuery()无法创建临时表SqlServer,c#,sql-server,C#,Sql Server,我试图从select语句中创建一个临时表,以便从临时表中获取模式信息 我可以通过以下代码在SQL Server中实现这一点: //This creates the temp table SELECT location.id, location.name into #URM_TEMP_TABLE from location //This retrieves column information from the temp table SELECT * FROM tempdb.INFORMATIO

我试图从select语句中创建一个临时表,以便从临时表中获取模式信息

我可以通过以下代码在SQL Server中实现这一点:

//This creates the temp table
SELECT location.id, location.name into #URM_TEMP_TABLE from location

//This retrieves column information from the temp table
SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME like '#U%'
如果我像这样在c中运行代码:

using (CONN = new SqlConnection(Settings.Default.UltrapartnerDBConnectionString))
                            {
                                var commandText = ReportToDisplay.ReportQuery.ToLower().Replace("from", "into #URM_TEMP_TABLE from");

                                using (SqlCommand command = CONN.CreateCommand())
                                {
                                    //Create temp table 
                                    CONN.Open();
                                    command.CommandText = commandText;
                                    int retVal = command.ExecuteNonQuery();
                                    CONN.Close();



                                    //get column data from temp table
                                    command.CommandText = "SELECT * FROM TEMPDB.INFORMATION_SCHEMA.Columns WHERE TABLE_NAME like '#U%'";
                                    CONN.Open();

                                    using (var reader = command.ExecuteReader())
                                    {
                                        while (reader.Read())
                                        {
                                            ColumnsForReport.Add(new ListBoxCheckBoxItemModel
                                            {
                                                Name = reader["COLUMN_NAME"].ToString(),
                                                DataType = reader["DATA_TYPE"].ToString(),
                                                IsSelected = false,
                                                RVMCommandModel = this
                                            });
                                        }
                                    }

                                    CONN.Close();

                                    //drop table
                                    command.CommandText = "DROP TABLE #URM_TEMP_TABLE";
                                    CONN.Open();
                                    command.ExecuteNonQuery();
                                    CONN.Close();
                                }
                            }
在到达drop语句之前,一切正常:无法删除表“URM\u TEMP\u table”


因此ExecuteOnQuery返回2547—这是临时表中应该包含的行数。但是,似乎表实际上并不是使用此方法创建的。ExecuteOnQuery是否是调用的正确方法?

临时表仅在当前会话的范围内,在您发布的代码中,您正在打开连接、创建临时表、关闭连接

然后打开另一个连接新会话并尝试删除不在该会话范围内的表

您需要在同一个连接中删除临时表,或者可能使其成为全局临时表-尽管在这种情况下,如果有两个单独的连接,全局临时表仍将超出范围

此外,正如在注释中指出的那样,临时表将自动清理—但是如果确实要删除它们,则必须从创建它们的会话中删除它们

从另一个SO线程进行编辑:

全局临时表的操作与本地临时表非常相似;他们 在tempdb中创建,导致的锁定和日志记录少于 永久席位。但是,它们对所有会话都可见,直到 创建会话超出范围,全局临时表不可用 不再被其他会话引用。如果两个不同的会话 请尝试上述代码,如果第一个代码仍处于活动状态,则第二个代码将处于活动状态 收到下列文件:

服务器:Msg 2714,16级,状态6,第1行已经有一个对象 在数据库中命名为“人”

我还没有看到使用全局临时变量的有效理由 桌子如果数据需要保留给多个用户,那么 至少对我来说,使用一张永久的桌子更有意义。你可以 通过在中创建全局临时表,使其更持久 一个自动启动程序,但我仍然看不出这是怎么回事 比固定的桌子更有利。有了一张永久的桌子,你可以 拒绝许可;不能拒绝全局临时表中的用户


看起来全局临时表仍然超出范围。。。它们在一般情况下不适合使用。您可以在同一个会话中删除该表,或者重新考虑您的解决方案吗?

我已更新该表以供使用,并且它给了我相同的东西:[System.Data.SqlClient.SqlException]={无法删除表'URM_TEMP_table',因为它不存在或者您没有权限。}使用全局临时表时要非常小心。它们非常危险,因为并发是一个真正的挑战。是的,我绝对建议不要使用全局临时表。此外,如果连接关闭,临时表已经被隐式删除。显式删除它们确实没有什么好处。请更改答案中的措辞-现在听起来像是建议使用全局临时表。为什么一直关闭每个查询之间的连接?我建议您创建一个存储过程来处理所有数据并返回列列表。按照您的编码方式,应用程序代码和数据库之间没有分离。为什么您认为需要删除临时表?我认为删除临时表是因为我想重用临时表。我不知道关闭连接会丢失临时表。