批量导入文本文件/ VB2005 / SQL Server 2005

时间:2011-08-12 11:41:49

标签: sql-server vb.net sql-server-2005 ssis etl

我继承了一个支持/增强的.NET应用程序,它可以读取几十万行的文件,以及数百万行中的一行。

原始开发人员留给我的代码如下: -

                For Each ModelListRow As String In ModelListDataArray
                    If ModelListRow.Trim.Length = 0 Or ModelListRow.Contains(",") = False Then
                        GoTo SKIP_ROW
                    End If

                    Dim ModelInfo = ModelListRow.Split(",")
                    Dim ModelLocation As String = UCase(ModelInfo(0))
                    Dim ModelCustomer As String = UCase(ModelInfo(1))
                    Dim ModelNumber As String = UCase(ModelInfo(2))

                    If ModelLocation = "LOCATION" Or ModelNumber = "MODEL" Then
                        GoTo SKIP_ROW
                    End If

                    Dim MyDataRow As DataRow = dsModels.Tables(0).NewRow
                    MyDataRow.Item("location") = ModelLocation.Replace(vbCr, "").Replace(vbLf, "").Replace(vbCrLf, "")
                    MyDataRow.Item("model") = ModelNumber.Replace(vbCr, "").Replace(vbLf, "").Replace(vbCrLf, "")
                    dsModels.Tables(0).Rows.Add(MyDataRow)
SKIP_ROW:
                Next

导入这些文件需要一个年龄(差不多半小时)。

我怀疑有更好的方法可以做到这一点。我正在寻找建议。

提前致谢。

3 个答案:

答案 0 :(得分:3)

看看BULK INSERT。

http://msdn.microsoft.com/en-us/library/ms188365(v=SQL.90).aspx

基本上,您将SQL Server指向CSV格式的文本文件,它完成了将数据拉入表格的所有逻辑。如果您需要按摩它,可以将文本文件拉到SQL Server中的暂存位置,然后运行存储过程将其按照您要查找的格式进行按摩。

答案 1 :(得分:1)

主要选项(除了从头开始编写自己的代码)是:

  • BULK INSERT或bcp.exe,如果您的数据格式干净,则效果很好
  • SSIS,如果您需要工作流程,数据类型转换,数据清理等。
  • .NET SqlBulkCopy API

jkohlhepp关于将数据拉入临时表然后清理它的建议是一个很好的例子,也是ETL过程中非常常见的模式。但是如果在TSQL中你的“按摩”并不容易,那么无论如何你都可能需要一些.NET代码,无论是在SSIS还是在CLR程序中。

我个人会在你的情况下使用SSIS,因为看起来数据格式不是很干净,所以你可能需要一些自定义代码来清理/重新格式化数据到数据库的路上。但是,它取决于您最熟悉/最有效的方式以及您现有的工具和标准。

答案 2 :(得分:0)

Dim ExcelConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcelSpreadsheet.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=Yes""")
ExcelConnection.Open()