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是要调用的正确方法吗?
临时表只在当前会话的范围内,在您发布的代码中,您正在打开连接、创建临时表、关闭连接。
然后打开另一个连接(新会话)并尝试删除不在该会话范围内的表。
您需要将临时表放在同一个连接中,或者可能使其成为全局临时表(##)——尽管在这种情况下有两个单独的连接,全局临时表仍然不在范围内。
此外,正如评论中所指出的,您的临时表将自动清理,但如果您真的想删除它们,则必须从创建它们的会话中删除。
编辑取自另一个SO线程:
SQL Server 中的全局临时表
全局临时表的操作与本地临时表非常相似;他们在tempdb中创建,导致的锁定和日志记录少于永久表。但是,它们对所有会话都可见,直到创建会话超出范围(全局##临时表为no被其他会话引用的时间更长)。如果两个不同的会话尝试上面的代码,如果第一个仍然有效,第二个将接收以下内容:
服务器:Msg 2714,级别16,状态6,行1已经有对象数据库中名为"##人"。
我还没有看到使用全局##临时的有效理由桌子如果数据需要持久存在于多个用户,则至少对我来说,使用一张永久性的桌子更有意义。你可以通过在一个自动启动程序,但我仍然看不出这是怎么回事比永久桌子更有优势。有了一张固定的桌子,你可以拒绝权限;不能拒绝全局##临时表中的用户。
看起来全局临时表仍然超出范围。。。它们在一般情况下使用起来很糟糕。你能在同一次会议上放下桌子还是重新思考你的解决方案?