2

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

4

5 回答 5

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 server .. 中创建一个stored procedure create #table并使用它..

3)并且您不想创建,DATASET那么您可以获取数据LIST并在 C# 端执行您的操作

于 2013-09-12T08:11:11.050 回答
3

您根本没有执行第一个命令,因此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();
        }
    }
}
于 2013-09-13T06:41:47.787 回答
1

1-SELECT * INTO # tempTable FROM tableA (local temp) or 2-SELECT * INTO ## tempTable FROM tableA (global temp)then

本地临时表只对用户当前连接可用;当用户与实例断开连接时,它们会自动删除。本地临时表名称以井号(“#”)开头。

全局温度表

全局临时表名称以双哈希 ("##") 开头。一旦这个表由一个连接创建,就像一个永久表一样,任何用户都可以通过任何连接使用它。只有在关闭所有连接后才能将其删除。

两者,临时表都存储在 tempdb 的临时文件夹中。每当我们创建一个临时表时,它都会进入 tempdb 数据库的 Temporary 文件夹。

SQL DB 中的临时表

于 2018-08-12T19:57:09.467 回答
0

将您的临时表从 更改#tempTable##tempTable.

Using##意味着一个全局临时表。完成任务后,您需要将其删除。

If Exists(Select * from tempdb..sysobjects Where id = object_id('tempdb.dbo.#tempTable'))

DROP TABLE #tempTable 
于 2013-09-12T07:57:13.537 回答
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();
        }
    }
}

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

于 2013-09-12T08:27:53.777 回答