ExecuteNonQuery()无法创建临时表SqlServer

本文关键字:创建 临时表 SqlServer ExecuteNonQuery | 更新日期: 2023-09-27 18:21:30

我正试图从a 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语句之前一切正常:无法删除表"#URL_TEMP_table"

所以ExecuteNonQuery返回2547,这是临时表应该包含的行数。然而,似乎实际上并没有使用它来创建表。ExecuteNonQuery是要调用的正确方法吗?

ExecuteNonQuery()无法创建临时表SqlServer

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

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

您需要将临时表放在同一个连接中,或者可能使其成为全局临时表(##)——尽管在这种情况下有两个单独的连接,全局临时表仍然不在范围内。

此外,正如评论中所指出的,您的临时表将自动清理,但如果您真的想删除它们,则必须从创建它们的会话中删除。

编辑取自另一个SO线程:

SQL Server 中的全局临时表

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

服务器:Msg 2714,级别16,状态6,行1已经有对象数据库中名为"##人"。

我还没有看到使用全局##临时的有效理由桌子如果数据需要持久存在于多个用户,则至少对我来说,使用一张永久性的桌子更有意义。你可以通过在一个自动启动程序,但我仍然看不出这是怎么回事比永久桌子更有优势。有了一张固定的桌子,你可以拒绝权限;不能拒绝全局##临时表中的用户。

看起来全局临时表仍然超出范围。。。它们在一般情况下使用起来很糟糕。你能在同一次会议上放下桌子还是重新思考你的解决方案?