从VBA中的数组批量插入到SQL中

我想在Excel中build立一个button,将选定的区域上传到SQL Server中的表。 第一行将被自动视为列标题。

如何继续这个呢? 我想要的是简单和超快速上传。

这是我的想法—

我将采取选定的区域,然后将其保存为一个.txt文件,然后在其上运行一个批量插入语句。 有没有一种方法可以直接批量插入选定的区域(可能首先将其放入一个变体数组中),而无需先将其保存为.txt文件?

另外,如果有一个更有效的方法,那么build议。

我将从一个简单的ADO连接到服务器,并执行一堆INSERT INTO语句,看看它是如何在性能方面。 如果这不起作用,那么你可以看看用相同的INSERT INTO语句创build一个文本文件。 这可能会更快,我真的不知道。 这里有一些代码将范围转换成你需要的SQL语句

 Function RangeToInsert(rRng As Range) As String Dim vaData As Variant Dim i As Long, j As Long Dim aReturn() As String Dim aCols() As String Dim aVals() As Variant Const sINSERT As String = "INSERT INTO MyTable " Const sVAL As String = " VALUES " 'Read in data vaData = rRng.Value 'Create arrays ReDim aReturn(1 To UBound(vaData)) ReDim aCols(1 To UBound(vaData, 2)) ReDim aVals(1 To UBound(vaData, 2)) 'Fill column name array from first row For j = LBound(vaData, 2) To UBound(vaData, 2) aCols(j) = vaData(1, j) Next j 'Go through the rest of the rows For i = LBound(vaData, 1) + 1 To UBound(vaData, 1) 'Fill a temporary array For j = LBound(vaData, 2) To UBound(vaData, 2) aVals(j) = vaData(i, j) Next j 'Build the string into the main array aReturn(i) = sINSERT & "(" & Join(aCols, ",") & ")" & sVAL & "(" & Join(aVals, ",") & ");" Next i RangeToInsert = Join(aReturn, vbNewLine) End Function 

以下是我输出的一些假数据的输出结果:

 ?rangetoinsert(selection) INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (97,100,53,27,14,53,94,43); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (21,96,69,60,70,8,35,54); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (8,12,78,38,82,67,41,53); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (15,32,89,100,61,78,16,37); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (46,37,75,66,66,93,19,45); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (82,30,56,10,99,2,1,29); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (98,39,98,96,95,60,16,73); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (65,79,69,70,74,86,15,59); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (30,37,12,57,86,94,6,53); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (1,20,91,65,20,26,96,57); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (81,7,68,65,56,27,81,80); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (94,42,43,33,46,82,44,24); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (88,48,34,83,58,64,36,90); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (51,28,43,70,12,29,96,27); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (62,54,76,86,92,41,40,84); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (11,21,32,30,65,6,22,75); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (44,72,38,73,44,93,4,16); INSERT INTO MyTable (F1,F2,F3,F4,F5,F6,F7,F8) VALUES (39,90,96,16,9,6,17,50); 

你可以把它放到你的ADO连接上的一个Execute调用中,或者把它写出到一个文本文件中。 我无法想象,其他任何事情都比使用SQL语句更快。 例如,你可以更新.Fields.Value属性,当你循环一个可更新的logging集,但是没有办法比这个更快。

如果你做了一百万行,VBA中的任何内容都不会很快。 所以记住这一点。