3

我正在尝试使用 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 和 year 的组合,也可以是 a NEWID()


我知道如何导入特定的列,例如我可以运行以下代码:

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

这适用于单个列,但我将如何让它适用于整个表(多列和多行)。

4

2 回答 2

3

所以我设法让它工作。这是使用 Excel 2010、SQL Sever 2012。
这假设 excel 中的行标题与 sql 中的列标题相同。
这也假设与问题帖子中的表格布局相似。


要将数据从 Excel 导入 SQL 服务器,我们可以使用 UDF 执行以下操作。在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. 选择表 ID
  3. 选择标题行(此处假定始终为年份)
  4. 选择具有所有行标题的列(这将是您的 sql 中的标题)
  5. 选择表中的所有数据

那应该这样做。
(PS如果这不是最有效的方法,或者你看到改进..随时编辑或添加)

于 2013-04-05T18:12:37.857 回答
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 或几个较小的 INSERT 中完成。

于 2013-04-04T22:22:38.333 回答