根据SQL Temporary Tables上的教程,使用SELECT * INTO #tempTable FROM tableA
创建临时表应该没问题,但当我尝试SQLException
时,它会让我SELECT * FROM #tempTable
Invalid object name '#tempTable'
。我是否知道在C#
中使用临时表的正确方法是什么?
string sql = "SELECT * INTO ##tempTable FROM (SELECT * FROM tableA)";
using (var command = new SqlCommand(sql, connection))
{
string sqlNew = "SELECT * FROM ##tempTable";
using (var command2 = new SqlCommand(sqlNew, connection))
{
using (var reader = command2.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["column1"].ToString());
}
Console.ReadLine();
}
}
}
我的目标是尝试使用从sqlVar
检索到的数据并将它们插入到tempTable中并对其执行一些操作。非常感谢如果有一些示例代码如何使代码适合上述代码。谢谢。
答案 0 :(得分:7)
但是为什么你需要SQL服务器端的临时表..
1)如果您希望在C#端执行操作,只需在DATASET
而不是DATAREADER
中获取数据..
DataSet dataset = new DataSet();
using (SqlConnection conn = new SqlConnection(connString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand("select * from tableA", conn);
conn.Open();
adapter.Fill(dataset);
conn.Close();
foreach (DataRow row in dataset.Tables[0]) // Loop over the rows.
{
// perform your operation
}
}
2)如果你需要在SQL端执行操作,那么在stored procedure
的SQL服务器上创建一个stored procedure create #table
并使用它..
3)并且您不想创建DATASET
然后您可以获取数据LIST
并在C#侧执行操作
答案 1 :(得分:2)
您根本没有执行第一个命令,因此未执行SELECT INTO
,因此未创建临时表,因此您会收到有关该表不存在的错误。
代码应为:
string sql = "SELECT * INTO ##tempTable FROM (SELECT * FROM tableA)";
using (var command = new SqlCommand(sql, connection))
{
command.ExecuteNonQuery(); // <-- THIS
string sqlNew = "SELECT * FROM ##tempTable";
using (var command2 = new SqlCommand(sqlNew, connection))
{
using (var reader = command2.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["column1"].ToString());
}
Console.ReadLine();
}
}
}
答案 2 :(得分:1)
1-SELECT * INTO#tempTable from tableA(本地临时)或 2-SELECT * INTO ## tempTable from tableA(global temp)then
本地临时表仅对用户的当前连接可用。当用户与实例断开连接时,它们会被自动删除。本地临时表名称以井号(#)开头。
全局温度表
全局临时表名称以双哈希(“ ##”)开头。一旦通过连接创建了该表(例如永久表),则任何用户都可以通过任何连接使用它。只有关闭所有连接后,才能将其删除。
这两个临时表都存储在tempdb的临时文件夹中。每当我们创建一个临时表时,它都会进入tempdb数据库的Temporary文件夹。
答案 3 :(得分:0)
将您的临时表从#tempTable
更改为##tempTable
。
使用##
表示保留的全局临时表。完成任务后,您需要删除它。
If Exists(Select * from tempdb..sysobjects Where id = object_id('tempdb.dbo.#tempTable'))
DROP TABLE #tempTable
答案 4 :(得分:0)
我认为你的答案在评论中:
会话期间可用的临时表格。
如果您想获取数据,您必须从同一范围内的临时表执行SELECT语句。
还有一件事:
我没有看到你正在执行var command
,你错过了这一行:
string sql = "SELECT * INTO ##tempTable FROM (SELECT * FROM tableA)";
using (var command = new SqlCommand(sql, connection))
{
command.ExecuteNonQuery();// This line is missing..
string sqlNew = "SELECT * FROM ##tempTable";
using (var command2 = new SqlCommand(sqlNew, connection))
{
using (var reader = command2.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["column1"].ToString());
}
Console.ReadLine();
}
}
}
但是错过这条线并不是你的实施错误的原因..