我正在尝试使用 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 中创建一个公共(public)函数
:
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 工作表中执行以下操作:
- 在单元格中键入
=import_data(
并按CTRL
+SHIFT
+A
- 选择 TableId
- 选择标题行(假设这里总是年份)
- 选择包含所有行标题的列(这将是您的 sql 中的标题)
- 选择表格中的所有数据
应该可以了。
(P.S. 如果这不是最有效的方法,或者您看到了改进.. 请随意编辑或添加)
关于sql - VBA:将表从 Excel 导入 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15822562/