【问题标题】:Table '#temptable' does not exist when executing drop table [#temptable] from code behind从后面的代码执行删除表 [#temptable] 时表“#temptable”不存在
【发布时间】:2014-10-04 09:56:20
【问题描述】:

我正在使用批量复制到临时表,然后将用于合并到主表。一切正常,但是当我尝试删除临时表时,我收到一条错误消息,提示“表 '#temptable' 不存在”

基本上我会做以下事情。

        'get data from excel to a datatable.
   Dim cmd As New OleDbCommand(sqlstring, excelConnection)
        dt.Load(cmd.ExecuteReader())  

        'create sql connection
  Using sqlcon As SqlConnection =
            New SqlConnection(ConfigurationManager.ConnectionStrings("SQLCON").ConnectionString)
                sqlcon.Open()
                'create temp table
                Dim sqlcmd As New SqlCommand("create table #tbltemp (ID int, FirstName nvarchar(50),LastName nvarchar(50),JobDesc nvarchar(50))", sqlcon)
                sqlcmd.ExecuteNonQuery()
                Try
                'start bulcopy
                    Using bulkcopy As SqlBulkCopy = New SqlBulkCopy(sqlcon)

                        'map columns
                        Dim mapID As New SqlBulkCopyColumnMapping("ID", "ID")
                        bulkcopy.ColumnMappings.Add(mapTMID)
                        Dim mapFName As New SqlBulkCopyColumnMapping("FirstName", "FirstName")
                        bulkcopy.ColumnMappings.Add(mapFName)
                        Dim mapLName As New SqlBulkCopyColumnMapping("LastName", "LastName")
                        bulkcopy.ColumnMappings.Add(mapLName)
                    End Using 'end bulkcopy using
                    'Inserts new records to main from temptable
                    Dim mergesql As String = "merge into dbo.Main as Target " & _
                              "using #tbltemp as Source " & _
                              "on " & _
                              "(Target.ID = Source.ID) " & _
                              "when not matched then " & _
                              "insert (ID,FirstName,LastName) values (Source.ID,Source.FirstName,Source.LastName);"
                    sqlcmd.CommandText = mergesql
                    sqlcmd.ExecuteNonQuery()
                    'Clean up stuff
                      cmd.CommandText = "DROP TABLE [#tbltemp]"
                      cmd.ExecuteNonQuery()


                Catch ex As Exception
                    Response.Write(ex.Message)
                Finally
'close sql con
                    sqlcon.Close()

                End Try
                'close excel con
                excelConnection.Close()
            End Using ' end using sqlcon

就像我说的,一切似乎都在工作,除了丢了桌子。这是否意味着临时表已自动删除?

我尝试运行一些测试并四处搜索,但没有运气。

【问题讨论】:

  • 您是否能够构建一个 shortcomplete 示例来演示该问题?目前,“代码”中显然缺少一些内容,它们实际上可能很重要。但是如果不能自己获取这段代码并运行它,就很难说清楚。它不一定是真正的代码 - 只是显示实际问题的东西(即在将样本编辑到您的问题之前检查自己是否确实具有行为)
  • 我编辑并添加了更多真实代码。我可能会关闭连接,这应该会清除 TMVector 建议的所有临时表?

标签: sql asp.net vb.net winforms temp-tables


【解决方案1】:

cmd 是与您的 excelconnection 关联的 OleDbcommand,而不是与您的数据库连接关联的 SqlCommand。

顺便说一句,我一直使用这种技术,您也可以将临时表创建为...

Select Top 0 * Into #tbltemp From dbo.Main

这省去了在静态创建表语句中定义列。

此外,如果您在同一连接中大量使用临时表,那么您可以检查它是否存在并使用...删除它...

If Object_Id('TempDB..#tbltemp') Is Not Null Drop Table #tbltemp

【讨论】:

    【解决方案2】:

    SQL Server 会在连接关闭时自动删除临时表,因此您实际上不需要这样做。

    不知道为什么它在 drop 部分失败。您可能没有正确的权限。

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 2011-02-16
      • 2014-08-09
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      相关资源
      最近更新 更多