我需要尽快将数据从 Excel 电子表格插入到 SQL Server。我尝试了几种选择,并放弃了所有涉及循环和创建记录集的性能较差的选项。有一种方法理论上应该很快,但它也出奇地慢,我不明白为什么。
下面的代码可以将工作表 DATA 中的所有数据插入到我们的本地 SQL Server 表 tbl_sales 中。我测试了 10k 行 X 30 列,需要 15 分钟。最终输入应约为。 250k 行 :(
不幸的是,BULK INSERT 或其他 SQL 过程不是一个选项,因为我们无权访问服务器。我必须通过 VBA 来解决它。
目标表(tbl_sales)被截断,没有索引...
Sub Import_To_SQL()
Set cnn = CreateObject("ADODB.Connection")
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"
nSQL = "INSERT INTO [odbc;driver={SQL Server};server=sss;uid=uuu;pwd=ppp;trusted_connection=yes;database=salesdb].dbo.tbl_sales SELECT * FROM [DATA$];"
cnn.Execute nSQL, , adExecuteNoRecords
cnn.Close
End Sub
我尝试创建记录集,然后通过
UpdateBatch
对数据库进行操作,但性能相当慢。
对于大型数据集,使用 Excel 连接对每一行数据执行 INSERT INTO 语句效率非常低。您可以使用 CopyFromRecordset 方法执行更高效的批量插入,如下所示:
Sub Import_To_SQL()
Dim cnn As Object
Dim rs As Object
Dim connString As String
Dim sqlServerConnString As String
Dim sqlQuery As String
' Excel connection
Set cnn = CreateObject("ADODB.Connection")
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"
' SQL Server connection
sqlServerConnString = "Provider=SQLOLEDB;Data Source=sss;Initial Catalog=salesdb;User ID=uuu;Password=ppp;"
Set rs = CreateObject("ADODB.Recordset")
' Open the recordset from the Excel worksheet
rs.Open "SELECT * FROM [DATA$];", cnn, adOpenStatic, adLockReadOnly
' Establish the connection to SQL Server
Set cnn = CreateObject("ADODB.Connection")
cnn.Open sqlServerConnString
' Set up the SQL query
sqlQuery = "INSERT INTO tbl_sales SELECT * FROM OPENROWSET('SQLOLEDB','" & sqlServerConnString & "', 'SELECT * FROM tbl_sales')"
' Execute the bulk insert
cnn.Execute sqlQuery
' Close connections
rs.Close
cnn.Close
End Sub
这会直接从 rs.Open 行中的 Excel 工作表打开记录集,然后使用单独的连接字符串打开与 SQL Server 建立连接,然后在单个批量操作中将整个记录集复制到 SQL Server 中的目标表,然后终止操作。
如果 SQL 连接字符串和目标表与您所拥有的不同,请调整它们。