C# ExecuteOnQuery()无法创建临时表SqlServer
我试图从select语句中创建一个临时表,以便从临时表中获取模式信息 我可以通过以下代码在SQL Server中实现这一点: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
//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',因为它不存在或者您没有权限。}使用全局临时表时要非常小心。它们非常危险,因为并发是一个真正的挑战。是的,我绝对建议不要使用全局临时表。此外,如果连接关闭,临时表已经被隐式删除。显式删除它们确实没有什么好处。请更改答案中的措辞-现在听起来像是建议使用全局临时表。为什么一直关闭每个查询之间的连接?我建议您创建一个存储过程来处理所有数据并返回列列表。按照您的编码方式,应用程序代码和数据库之间没有分离。为什么您认为需要删除临时表?我认为删除临时表是因为我想重用临时表。我不知道关闭连接会丢失临时表。