2013-04-10 71 views
4

我需要通過ADO.NET創建臨時表,然後在temp和實際表之間的服務器上執行BulkCopy,然後執行Merge在ADO.NET中使用動態創建的臨時表進行批量複製

問題是使用純ADO.NET創建臨時表動態。 模式應該與現有的表相同,但是這個表是使用ORM(NHibernate或Entity Framework,我們還不確定)創建的。這也意味着架構可以在未來發生變化。

有沒有什麼辦法可以使用普通的ADO.NET對象在數據庫中創建表?如包含原始表格模式的DataTable

任何信息指向我在正確的方向表示讚賞。

回答

3

我設法根據現有模式創建臨時表。

Blogged the solution on my site

+0

您可以使用TOP 0而不是WHERE子句來確保您沒有結果。 SELECT TOP 0 * INTO #TmpTable FROM SomeTable; – Robert 2014-08-08 15:44:39

+1

您正在遍歷列表列表3次,這可能是一次性完成的。你的大部分代碼都將把列推入一個你甚至沒有在任何地方使用的字符串生成器。 – 2017-10-24 10:44:09

+1

@Daniel Leiszen,你是對的。我很高興地說,5年後,我寫了糟糕的代碼:)我希望我可以在今後的5年中繼續說今天的代碼:) – Ronald 2018-01-10 09:45:37

2

您可以使用select into #somename創建臨時表。

connection_ = New SqlClient.SqlConnection(connection_string_) 
connection_.Open() 
If connection_.State = ConnectionState.Open Then 

    command_.Connection = connection_ 
    command_.CommandType = CommandType.Text 
    command_.CommandText = "select * into #some_table from some_table where some_id = 0" 
    command_.ExecuteNonQuery() 

    Dim line_index_ As Integer = 0 
    Dim data_table_ As DataTable = New DataTable() 
    Using parser_ As FileIO.TextFieldParser = New FileIO.TextFieldParser(path_) 
     parser_.SetDelimiters(delimiter_) 
     parser_.HasFieldsEnclosedInQuotes = False 
     While Not parser_.EndOfData 
      If line_index_ = 0 Then 
       Dim headers_ As String() = parser_.ReadFields() 
       For Each header_ In headers_ 
        data_table_.Columns.Add(header_) 
       Next 
      Else 
       Dim row_ As DataRow = data_table_.NewRow() 
       row_.ItemArray = parser_.ReadFields() 
       data_table_.Rows.Add(row_) 
      End If 
      line_index_ += 1 
     End While 
    End Using 

    Using bulkCopy_ As SqlBulkCopy = New SqlBulkCopy(connection_) 
      bulkCopy_.DestinationTableName = "#some_table" 
      bulkCopy_.WriteToServer(data_table_) 
    End Using 

    ' proof 
    command_.CommandText = "select * from #some_table" 
    Dim reader_ As SqlDataReader = Nothing 
    reader_ = command_.ExecuteReader 
    line_index_ = 0 
    While reader_.Read 
     line_index_ += 0 
    End While 

End If 
+3

您可以使用TOP 0而不是WHERE子句來確保不會得到任何結果。 SELECT TOP 0 * INTO #TmpTable FROM SomeTable; – Robert 2014-08-08 15:45:01

+0

該解決方案看起來很理想,但可能會因您的限制而失敗。例如,我有一個字段'創建DATETIME NOT NULL DEFAULT GETDATE()'。然而臨時表保留了'NOT NULL'而不是'DEFAULT GETDATE()',這意味着我將不得不在我的批量插入中考慮這一點。 – atheaos 2016-05-09 17:28:52

+0

如果您保持打開同一個會話,則可以訪問剛剛創建的臨時表。您可以創建一個存儲過程來使用該臨時表,然後從中取出它。 – 2016-05-10 08:30:10