表' #temptable'从后面的代码执行drop table [#temptable]时不存在

时间:2014-08-11 14:19:41

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

我正在使用批量复制到临时表,然后将其用于MERGE到主表。一切正常,但是当我尝试删除我的临时表时,我收到一条错误,说'表'#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
像我说的那样,除了丢桌子外,一切似乎都在起作用。这是否意味着临时表已自动删除?

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

2 个答案:

答案 0 :(得分:0)

SQL Server将在连接关闭时自动删除临时表,因此实际上您无需执行此操作。

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

答案 1 :(得分:0)

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

我很自然地一直使用这种技术,你也可以创建临时表......

Select Top 0 * Into #tbltemp From dbo.Main

这可以节省在静态create table语句中定义列。

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

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