ExecuteNonQuery()无法创建临时表SqlServer

jharr100

我试图从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_TEMP_TABLE'

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

克里特纳

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

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

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

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

编辑来自另一个SO线程:

SQL Server中的全局临时表

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

服务器:消息2714,级别16,状态6,第1行在数据库中已经有一个名为“ ## people”的对象。

我还没有看到使用全局## temp表的有效理由。如果数据需要保留给多个用户,那么使用永久表至少对我来说有意义。通过在自动启动过程中创建全局## temp表,您可以使它稍微更永久一些,但是我仍然看不出它比永久表有什么优势。使用永久表,您可以拒绝权限。您不能从全局## temp表中拒绝用户。

看起来全局临时表仍然超出范围...在一般的IMO中很难使用。您可以只在同一会话中删除表还是重新考虑您的解决方案?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章