C#选择进入解释/临时表

时间:2013-09-12 07:45:07

标签: c# sql temp-tables

根据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中并对其执行一些操作。非常感谢如果有一些示例代码如何使代码适合上述代码。谢谢。

5 个答案:

答案 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文件夹。

temp table in SQL DB

答案 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();
        }
    }
}

但是错过这条线并不是你的实施错误的原因..