如何编写使用c#创建的临时表的存储过程

本文关键字:临时表 存储过程 创建 何编写 | 更新日期: 2023-09-27 18:09:01

我有一个用c#开发的应用程序,它遵循这个工作流:

  • 读取CSV文件
  • 创建临时表
  • 使用SqlBulkCopy
  • 将CSV数据发送到临时表
  • 调用存储过程将临时表合并到真实表
  • 删除临时表

    using (var dbConnection = new SqlConnection(_connectionString))
    {
        dbConnection.Open();
        using (var cmd = new SqlCommand("CREATE TABLE [#UpdatedData]([Path] [nvarchar](50))", dbConnection))
        {
            cmd.ExecuteNonQuery();
        }
        using (var bulkCopy = new SqlBulkCopy(dbConnection))
        {
            bulkCopy.DestinationTableName = "[#UpdatedData]";
            bulkCopy.WriteToServer(dt);
        }
        using (var cmd = new SqlCommand("usp_MergeData", dbConnection))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();
        }
        using (var cmd = new SqlCommand("DROP TABLE [#UpdatedData]", dbConnection))
        {
            cmd.ExecuteNonQuery();
        }
    }
    

我的问题是我在c#中创建临时表,我不能写SQL Server存储过程,因为它找不到临时表。有什么变通办法吗?

我使用localdb用于开发和SQL Azure用于生产。

如何编写使用c#创建的临时表的存储过程

您可以创建一个全局临时表:

using (var cmd = new SqlCommand(
    "CREATE TABLE [##UpdatedData]([Path] [nvarchar](50))"
    , dbConnection))

在本地临时表名前加单数字符号(#table_name),在全局临时表名前加双数字符号(##table_name)。


编辑

由于在SQL Azure中无法创建全局临时表,因此您可能必须创建一个真正的表

我终于使它没有永久表或全局表了!

我没有尝试在SQL Server中创建MERGE存储过程,而是用c#在字符串中编写了一个大的MERGE函数,并将其作为普通的SQL查询执行!