将多个数据从 excel 加载到 sql SSIS
load multiple data from excel to sql SSIS
我正在使用 SSIS,我需要使用 SSIS
将具有以下 (Yellos) 格式的多个文件加载到 SQL
如您所见,问题是如果填充了 A 列(例如:忽略第 14 - X 行),文件的格式很糟糕,只能处理/使用记录,我需要将 D1 中的值插入到日期列。
有什么建议吗?
此致!
让我们把这个问题分成3个子问题:
- 从
D1
获取日期值
- 从第 4 行开始读取
- 忽略 Column1 为 NULL 的所有行
解决方案
1.从 D1
获取日期值
- 创建 2 个 SSIS 变量,
@[User::FilePath]
(字符串类型),其中包含 excel 文件路径,@[User::FileDate]
(字符串类型) 我们将使用它来存储日期值
- 添加脚本任务,选择脚本语言Visual Basic
- Select
@[User::FilePath]
作为 ReadOnly 变量 和 @[User::FileDate]
作为 ReadWrite 变量
- 打开脚本编辑器并使用以下代码检索日期值并将其存储到
@[User::FileDate]
这将搜索名为 Refunds
的 sheet 并从中提取日期值并将该值存储到 @[User::FileDate]
m_strExcelPath = Dts.Variables.Item("FilePath").Value.ToString
Dim strSheetname As String = String.Empty
Dim strDate as String = String.Empty
m_strExcelConnectionString = Me.BuildConnectionString()
Try
Using OleDBCon As New OleDbConnection(m_strExcelConnectionString)
If OleDBCon.State <> ConnectionState.Open Then
OleDBCon.Open()
End If
'Get all WorkSheets
m_dtschemaTable = OleDBCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
New Object() {Nothing, Nothing, Nothing, "TABLE"})
'Loop over work sheet to get the first one (the excel may contains temporary sheets or deleted ones
For Each schRow As DataRow In m_dtschemaTable.Rows
strSheetname = schRow("TABLE_NAME").ToString
If Not strSheetname.EndsWith("_") AndAlso strSheetname.EndsWith("$") Then
If Not strSheetname.Tolower.Contains("refunds") Then Continue For
Using cmd As New OleDbCommand("SELECT * FROM [" & strSheetname & "A1:D1]", OleDBCon)
Dim dtTable As New DataTable("Table1")
cmd.CommandType = CommandType.Text
Using daGetDataFromSheet As New OleDbDataAdapter(cmd)
daGetDataFromSheet.Fill(dtTable)
'Get Value from column 4 (3 because it is a zero-based index
strDate = dtTable.Rows(0).Item(3).ToString
End Using
End Using
'when the first correct sheet is found there is no need to check others
Exit For
End If
Next
OleDBCon.Close()
End Using
Catch ex As Exception
Throw New Exception(ex.Message, ex)
End Tr
Dts.Variables.Item("FileDate").Value = strDate
Dts.TaskResult = ScriptResults.Success
End Sub
在DataFlow Task中添加一个Derived Column Transformation
,添加一个派生列,表达式如下
@[User::FileDate]
2。从第 4 行开始阅读
因为我们假设 Excel 文件路径存储在 @[User::FilePath]
- 首先打开
Excel Connection Manager
并取消勾选First row has column names
- 在数据流任务中,双击 excel 源
- 将源设置为
SQL Command
- 使用以下命令:
SELECT * FROM [Refunds$A4:D]
,因此它将从第 4 行开始读取
- 列名称将如下所示 F1 ... F4 ,在 excel 源中,您可以转到“列”选项卡并为列名称指定别名,因此在数据流任务中它们将是显示了他们的别名
3。忽略 Column1 为 NULL 的所有行
- 在 Excel 来源
之后添加条件拆分
根据以下表达式拆分流
ISNULL([F1]) == False
如果您没有给 F1
别名,否则使用别名
最后,记住你必须添加一个包含日期值
的派生列(正如我们在第一个子问题中所说的)
我正在使用 SSIS,我需要使用 SSIS
将具有以下 (Yellos) 格式的多个文件加载到 SQL如您所见,问题是如果填充了 A 列(例如:忽略第 14 - X 行),文件的格式很糟糕,只能处理/使用记录,我需要将 D1 中的值插入到日期列。
有什么建议吗?
此致!
让我们把这个问题分成3个子问题:
- 从
D1
获取日期值
- 从第 4 行开始读取
- 忽略 Column1 为 NULL 的所有行
解决方案
1.从 D1
获取日期值- 创建 2 个 SSIS 变量,
@[User::FilePath]
(字符串类型),其中包含 excel 文件路径,@[User::FileDate]
(字符串类型) 我们将使用它来存储日期值 - 添加脚本任务,选择脚本语言Visual Basic
- Select
@[User::FilePath]
作为 ReadOnly 变量 和@[User::FileDate]
作为 ReadWrite 变量 - 打开脚本编辑器并使用以下代码检索日期值并将其存储到
@[User::FileDate]
这将搜索名为 Refunds
的 sheet 并从中提取日期值并将该值存储到 @[User::FileDate]
m_strExcelPath = Dts.Variables.Item("FilePath").Value.ToString
Dim strSheetname As String = String.Empty
Dim strDate as String = String.Empty
m_strExcelConnectionString = Me.BuildConnectionString()
Try
Using OleDBCon As New OleDbConnection(m_strExcelConnectionString)
If OleDBCon.State <> ConnectionState.Open Then
OleDBCon.Open()
End If
'Get all WorkSheets
m_dtschemaTable = OleDBCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
New Object() {Nothing, Nothing, Nothing, "TABLE"})
'Loop over work sheet to get the first one (the excel may contains temporary sheets or deleted ones
For Each schRow As DataRow In m_dtschemaTable.Rows
strSheetname = schRow("TABLE_NAME").ToString
If Not strSheetname.EndsWith("_") AndAlso strSheetname.EndsWith("$") Then
If Not strSheetname.Tolower.Contains("refunds") Then Continue For
Using cmd As New OleDbCommand("SELECT * FROM [" & strSheetname & "A1:D1]", OleDBCon)
Dim dtTable As New DataTable("Table1")
cmd.CommandType = CommandType.Text
Using daGetDataFromSheet As New OleDbDataAdapter(cmd)
daGetDataFromSheet.Fill(dtTable)
'Get Value from column 4 (3 because it is a zero-based index
strDate = dtTable.Rows(0).Item(3).ToString
End Using
End Using
'when the first correct sheet is found there is no need to check others
Exit For
End If
Next
OleDBCon.Close()
End Using
Catch ex As Exception
Throw New Exception(ex.Message, ex)
End Tr
Dts.Variables.Item("FileDate").Value = strDate
Dts.TaskResult = ScriptResults.Success
End Sub
在DataFlow Task中添加一个
Derived Column Transformation
,添加一个派生列,表达式如下@[User::FileDate]
2。从第 4 行开始阅读
因为我们假设 Excel 文件路径存储在 @[User::FilePath]
- 首先打开
Excel Connection Manager
并取消勾选First row has column names
- 在数据流任务中,双击 excel 源
- 将源设置为
SQL Command
- 使用以下命令:
SELECT * FROM [Refunds$A4:D]
,因此它将从第 4 行开始读取
- 列名称将如下所示 F1 ... F4 ,在 excel 源中,您可以转到“列”选项卡并为列名称指定别名,因此在数据流任务中它们将是显示了他们的别名
3。忽略 Column1 为 NULL 的所有行
- 在 Excel 来源 之后添加条件拆分
根据以下表达式拆分流
ISNULL([F1]) == False
如果您没有给 F1
别名,否则使用别名
最后,记住你必须添加一个包含日期值
的派生列(正如我们在第一个子问题中所说的)