我正在使用批量复制到临时表,然后将其用于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
像我说的那样,除了丢桌子外,一切似乎都在起作用。这是否意味着临时表已自动删除?
我试过运行一些测试并四处搜索但没有运气。
答案 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