2013-04-04 112 views
3

我想從Excel中導入數據表到SQL Server 2012,使用VBA。
最好藉助於UDF。VBA:從Excel導入表到SQL

excel表看起來像這樣。

TableID 2012 2011 2010 2009 
row 1  11  12 13 14 
row 2  21  22 23 24 
row 3  31  32 33 34 
etc.. 

(I放置的數字在細胞指定它們的位置,例如11 =行1,列1)

數據庫表看起來是這樣的。

Header:  id | year | row1 | row2 | row3 | etc.. 
ExampData: TableId 2012  11  21  31  .. 
ExampData: TableId 2011  12  22  32  .. 

(這不包括主鍵列,它可以是一個ID和一年的組合,或NEWID()


我知道如何導入特定列,例如我可以運行下面的代碼:

INSERT INTO example_table (id, year, row1, row2, row3) VALUES ('001', '2012', '11', '21', '31') 

這個偉大的工程單獨的列,但我將如何去使之成爲整個表(多行多列)工作。

+0

這是一次性還是不常運行的操作?如果是這樣,那麼你不必擔心效率太高。那是除非有很多行要導入。你爲什麼要提高效率? – 2013-04-04 22:15:08

+0

它會定期每天 - 每天多張桌子。 – 2013-04-05 14:55:53

回答

3

所以我設法讓它工作。這是使用Excel 2010,SQL Sever 2012.
這假定excel中的行標題與sql中的列標題相同。
這也假設在問題文章中的表格類似佈局。


要使用UDF將數據從Excel導入到SQL服務器,我們可以執行以下操作。
在Excel中創建Public Function

Public Function import_data(TableID, vHeader As Variant, vRow As Variant, vData As Variant) 
End Function 

,並使用您喜歡的連接方式連接到數據庫。
那麼對於INSERT語句中使用下列內容:

'Declare the variables 
Dim vpush As String 
Dim headerCount As Long 
Dim rowTitles As String 
Dim rowDatas As String 
Dim i As Long 

`Count the amount of columns 
headerCount = Application.CountA(vHeader) 

`Create insert statement 
For i = 1 To headerCount 
    rowTitles = VBA.Join(WorksheetFunction.Transpose(vRow), ", ") 
    rowDatas = VBA.Join(WorksheetFunction.Transpose(Application.Index(vData, , i)), "', '") 
    vpush = "INSERT INTO example_table (id, " & rowTitles & ", year) VALUES ('" & TableID & "', '" & rowDatas & "', '" & vHeader(i) & "')" 
Next i 

不要忘記.Execute (vpush)

比任何時候你要導入的表,你會做在Excel工作表如下:

  1. 在細胞類型=import_data(並按CTRL + SHIFT + A
  2. 選擇TABLEID
  3. 選擇標題行(假設總是在這裏幾年)
  4. 選擇具有所有行標題的列(這將成爲sql中的標題標題)
  5. 選擇表格中的所有數據

應該這樣做。
(P.S.如果這不是最有效的方式,或者你看到了改進......可隨意編輯或添加)

2

如果您使用SQL Server 2008或更高版本,可以把多行INSERT語句中:

INSERT INTO example_table (id, year, row1, row2, row3) 
VALUES ('001', '2012', '11', '21', '31'), 
    ('002', '2012', '12', '22', '32'), 
    ('003', '2012', '13', '23', '33') 

根據您的電子表格有多大,你可以做一個大的INSERT或一些小的。

+0

謝謝!是否有可能使'VALUES'行變量?我永遠不知道會有多少行。有沒有像'INSERT INTO example_table(id,year,row1,row2,row3) VALUES Var(i)'work?然後使用'For i = 1到NumRows'。 – 2013-04-05 14:59:25