【问题标题】:Importing more than 1000 rows from Excel to SQL-server将超过 1000 行从 Excel 导入 SQL-server
【发布时间】:2016-03-16 06:15:54
【问题描述】:

流程在Excel VBA 2010和MS SQL Server 2008环境下运行。

假设在 Excel 表格中有一个简单的一列数据,包含 1500 行,我们希望使用 VBA 代码中的 SQL 查询将其导出到数据库(VBA 中的 SQL 过程在默认模式下一次最多导出 1000 行)。

这个问题有一个限制:导出过程必须使用 dbclass-connection 而不是 ADODB 连接。 (代码所有者不是我。代码所有者正在使用 dbclass 编写相当大的 VBA 代码,所以他可能不会接受更改整个代码。

我为ADODB.Connection 找到了类似lngRecsAff 的选项,其用法如下:

Sub test() 
   Dim cn As ADODB.Connection 
   Dim strSQL As String 
   Dim lngRecsAff As Long 
   Set cn = New ADODB.Connection 
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.xls; Extended Properties=Excel 8.0" 

  strSQL = "Insert INTO [odbc;Driver={SQL Server};Server=SQL09;Database=Tom;UID=userID;PWD=password].tbl_test1 Select * FROM [Sheet1$]" 
  cn.Execute strSQL, lngRecsAff
  cn.Close 
  Set cn = Nothing 
End Sub

我尝试在我的 dbclass 执行中实现 lngRecsAff,例如:

Sub test()
  Dim connOk As Boolean
  Dim rs As New ADODB.Recordset
  Set dbclass = New clsDB
  Dim Value1() As Variant
  Dim lngRecsAff As Long
  Dim strSQL as String
  Dim mstrErr as Boolean

  dbclass.Database = "database_name"
  dbclass.ConnectionType = SqlServer
  dbclass.DataSource = "server_name"
  dbclass.UserID = Application.UserName

  connOk = dbclass.OpenConnection(False, True)
    If connOk = False Then
       MsgBox "Unsuccessful connection!"
    Else
       MsgBox "Successful connection"
    End If

  strSQL = "INSERT INTO [dbo].[table1](Column1) Values('" & Value1 & "')"
  mstrErr = dbclass.ExecuteSQL(strSQL, lngRecsAff) ' The result mstrErr is a Boolean 
   ' Some closing options here
End Sub

我收到类似lngRecsAff 不适合我的ExecuteSQL 程序的错误。通常我的执行mstrErr = dbclass.ExecuteSQL(strSQL) 没有任何问题。

也许我可以使用for-loop 执行 SQL 过程,然后我可以将数据分成小块发送。但我想找到一个更有效、“更好”的解决方案,一次发送整个数组。

那么dbclass 有什么特殊选项可以将超过 1000 行从 Excel 发送到数据库吗?

【问题讨论】:

  • 您的插入语句根本没有任何意义。您不会插入连接字符串。您使用连接字符串建立连接,然后向表中发出插入。
  • 您不能使用比嵌入在 VBA 中的插入查询更合适的工具来导入数据吗?比如SSIS?
  • 我对 SSIS 不熟悉,但现在我看了一下。我认为还有另一种选择,例如OPENROWSET ,我现在就去看看。你知道OPENROWSET选项是否可以导入长数据集吗?
  • 如果您必须使用自定义 DB 类(而不是直接使用 ADO)进行插入,那么您确实需要与该类的所有者讨论如何最好地将它用于您需要做的事情。由于我们不知道该类是如何实现的,所以在这里询问没有多大意义......
  • @tim-williams 我编辑了我的代码,它显示了代码如何打开与服务器的连接。我是否应该显示有关如何实现连接类的更多信息?

标签: sql-server vba excel import-from-excel


【解决方案1】:

您可以使用喜欢的服务器直接查询 Excel-Sheet。

在您的 Management Studio 中单击“服务器对象”,然后右键单击“链接服务器”。在那里您将能够添加新的链接服务器。

如果您需要进一步的帮助,您可以轻松找到教程。一个在这里: https://www.mssqltips.com/sqlservertip/2018/using-a-sql-server-linked-server-to-query-excel-files/

【讨论】:

  • 看起来不错,但是在“开发”过程中,Excel文件的名称总是在变化。所以链接到一个特定的 Excel 名称是行不通的。
  • 您可以使用 T-SQL 链接(和取消链接)服务器,在此处找到一些示例:stackoverflow.com/q/189422/5089204
  • @user3714330,您好,我很好奇...我的回答对您解决问题有帮助吗?
  • 现在我不在工作,所以还不能尝试。但仍然感觉在 vba 代码中解决它会更好。我可以向代码所有者提出这个解决方案,但如果他也发现了这种做法,我也不会。
  • @user3714330,因为我们不知道这个clsDB-你不能指望这里有人知道解决方案......一个很好的论点应该是,只涉及技术总是更好你真的需要。这是您在数据库中的权利问题。如果它们足够了,那么使用实际的 Excel 名称动态创建链接服务器比进行传输更容易,然后删除链接服务器......最好是一个以文件名作为参数的存储过程......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多