批量导入大量数据到SQL SERVER方法

时间:2022-05-01 06:37:30
目前我利用ADO的RECORDSET对象的ADDNEW()以及UPDATEBATCH()方法进行数据导入,但发现一条一条记录导入效率很低,对于每五分钟需要导入上十万条记录几乎是不可能实现。
我需要导入的数据是由程序解释一种特殊的文件而来的,无法使用SQL SERVER的BCP方式来完成,因此希望请教一下各个大侠ADO有没其他高效的批量导入方法啊?请各位指点,如果有示例代码那就更好了,谢谢~

7 个解决方案

#1


试试UpdateBatch,下面VB代码,参考修改下就好了。
Public Sub UpdateBatchX()

   Dim rstTitles As ADODB.Recordset
   Dim strCnn As String
   Dim strTitle As String
   Dim strMessage As String

   ' 将连接字符串赋值给变量。
      strCnn = "Provider=sqloledb;" & _
      "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

   Set rstTitles = New ADODB.Recordset
   rstTitles.CursorType = adOpenKeyset
   rstTitles.LockType = adLockBatchOptimistic
   rstTitles.Open "titles", strCnn, , , adCmdTable
   
   rstTitles.MoveFirst

   ' 对记录集执行循环并询问用户是否要更改指定标题的类型。
   Do Until rstTitles.EOF
      If Trim(rstTitles!Type) = "psychology" Then
         strTitle = rstTitles!Title
         strMessage = "Title: " & strTitle & vbCr & _
            "Change type to self help?"

         If MsgBox(strMessage, vbYesNo) = vbYes Then
            rstTitles!Type = "self_help"
         End If
      End If

      rstTitles.MoveNext
   Loop

   ' 询问用户是否要提交以上所作的全部更改。
   If MsgBox("Save all changes?", vbYesNo) = vbYes Then
      rstTitles.UpdateBatch
   Else
      rstTitles.CancelBatch
   End If

   ' 打印记录集中的当前数据。
   rstTitles.Requery
   rstTitles.MoveFirst
   Do While Not rstTitles.EOF
      Debug.Print rstTitles!Title & " - " & rstTitles!Type
      rstTitles.MoveNext
   Loop

   ' 恢复原始值,因为这只是演示。
   rstTitles.MoveFirst
   Do Until rstTitles.EOF
      If Trim(rstTitles!Type) = "self_help" Then
         rstTitles!Type = "psychology"
      End If
      rstTitles.MoveNext
   Loop
   rstTitles.UpdateBatch

   rstTitles.Close

End Sub

#3


楼上这个也是等于先用FOR循环,再用UPDATEBATCH的方法,有没其他可以优化的,不用UPDATEBATCH的

#4


呵呵,UPDATEBATCH这个方法我也没有用过,不过应该比一个一个update要快的,在2L给的链接也可以试试。

#5


如果没有特别好的办法就这样吧:
保证快:)
----------------------------------------------
把多条数据组成一个字符串,一次插入,

insert into tb(stu_no,stu_name)
select '001','zhangsan'
union all select '002','lisi'
union all select '003','wangwu'
union all ..........



需要注意的是:小心字符串长度超标,比如CString最大可以容纳多少字符,小心别超了!

希望你明白, 

#6


ADO.NET提供一个SqlBulkCopy可以批量插入数据,效率很高
而ADO没有这个方法,所以没办法以前就用存储过程稍微优化了下
ADO这块感觉ms的意思以后都只管.NET平台了

#7


在查询分析器中
USE ......//数据库名
insert into table select..,..,..,..,.. (列名)from ('MICROSOFT.JET.OLEDB4.0','Data Source="c:text.xls(数据所在excel的名字)",USER ID-Admin,Password=;Extended properties=Excel5.0')...[sheet1$(数据所在的sheet)]
用这个方法可以一次性向SQLServer中导入几万个数据

#1


试试UpdateBatch,下面VB代码,参考修改下就好了。
Public Sub UpdateBatchX()

   Dim rstTitles As ADODB.Recordset
   Dim strCnn As String
   Dim strTitle As String
   Dim strMessage As String

   ' 将连接字符串赋值给变量。
      strCnn = "Provider=sqloledb;" & _
      "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

   Set rstTitles = New ADODB.Recordset
   rstTitles.CursorType = adOpenKeyset
   rstTitles.LockType = adLockBatchOptimistic
   rstTitles.Open "titles", strCnn, , , adCmdTable
   
   rstTitles.MoveFirst

   ' 对记录集执行循环并询问用户是否要更改指定标题的类型。
   Do Until rstTitles.EOF
      If Trim(rstTitles!Type) = "psychology" Then
         strTitle = rstTitles!Title
         strMessage = "Title: " & strTitle & vbCr & _
            "Change type to self help?"

         If MsgBox(strMessage, vbYesNo) = vbYes Then
            rstTitles!Type = "self_help"
         End If
      End If

      rstTitles.MoveNext
   Loop

   ' 询问用户是否要提交以上所作的全部更改。
   If MsgBox("Save all changes?", vbYesNo) = vbYes Then
      rstTitles.UpdateBatch
   Else
      rstTitles.CancelBatch
   End If

   ' 打印记录集中的当前数据。
   rstTitles.Requery
   rstTitles.MoveFirst
   Do While Not rstTitles.EOF
      Debug.Print rstTitles!Title & " - " & rstTitles!Type
      rstTitles.MoveNext
   Loop

   ' 恢复原始值,因为这只是演示。
   rstTitles.MoveFirst
   Do Until rstTitles.EOF
      If Trim(rstTitles!Type) = "self_help" Then
         rstTitles!Type = "psychology"
      End If
      rstTitles.MoveNext
   Loop
   rstTitles.UpdateBatch

   rstTitles.Close

End Sub

#2


#3


楼上这个也是等于先用FOR循环,再用UPDATEBATCH的方法,有没其他可以优化的,不用UPDATEBATCH的

#4


呵呵,UPDATEBATCH这个方法我也没有用过,不过应该比一个一个update要快的,在2L给的链接也可以试试。

#5


如果没有特别好的办法就这样吧:
保证快:)
----------------------------------------------
把多条数据组成一个字符串,一次插入,

insert into tb(stu_no,stu_name)
select '001','zhangsan'
union all select '002','lisi'
union all select '003','wangwu'
union all ..........



需要注意的是:小心字符串长度超标,比如CString最大可以容纳多少字符,小心别超了!

希望你明白, 

#6


ADO.NET提供一个SqlBulkCopy可以批量插入数据,效率很高
而ADO没有这个方法,所以没办法以前就用存储过程稍微优化了下
ADO这块感觉ms的意思以后都只管.NET平台了

#7


在查询分析器中
USE ......//数据库名
insert into table select..,..,..,..,.. (列名)from ('MICROSOFT.JET.OLEDB4.0','Data Source="c:text.xls(数据所在excel的名字)",USER ID-Admin,Password=;Extended properties=Excel5.0')...[sheet1$(数据所在的sheet)]
用这个方法可以一次性向SQLServer中导入几万个数据