VBA:从Excel导入表格到SQL

我正在尝试使用VBA将excel中的数据表导入到SQL Server 2012中。
最好借助于UDF。

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.. 

(我把数字放在单元格中指定它们的位置,例如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') 

这对于单个列非常适用,但是我怎样才能使它适用于整个表格(多列和多行)。

所以我设法得到它的工作。 这是使用Excel 2010,SQL Sever 2012。
这假定Excel中的行标题与sql中的列标题相同。
这也假设在问题文章中类似的表格布局。


要从Excel导入数据到SQL服务器,使用UDF我们可以做到以下几点。
在excel中创build一个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. selectTableId
  3. select标题行(假设在这里总是年)
  4. select所有行标题的列(这将是您的SQL中的标题标题)
  5. select表中的所有数据

这应该做到这一点。
(PS如果这不是最有效的方式,或者你看到改进..随意编辑或添加)

如果您使用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或几个较小的INSERT中执行此操作。