这是一种使用Script Task 将不同结构的表导出到平面文件的可能方法。此示例将使用脚本任务将包含不同字段和数据的两个表导出到平面文件。为了导出数据,您可以使用DataReader 而不是使用DataGrid。可能还有其他可能的方法来做到这一点。
分步过程:
- 使用 SQL 脚本 部分中提供的脚本创建三个名为
dbo.TablesList、dbo.Source1 和 dbo.Source2 的表。
- 使用屏幕截图 #1 中显示的数据填充表
dbo.TablesList、dbo.Source1 和 `dbo.Source2``。
- 在 SSIS 包的
Connection manager 上,创建一个名为 SQLServer 的 OLE DB connection 以连接到 SQL Server 实例,如屏幕截图 #2 所示。
- 在包中,创建 4 个变量,如屏幕截图 #3 所示。
- 在控制流中,将
Execute SQL Task、Foreach Loop Container 和Script Task 放在Foreach loop container 中,如屏幕截图#4 所示。
- 如屏幕截图 #5 和 #6 所示配置
Execute SQL task。
- 如屏幕截图 #7 和 #8 所示配置
Foreach Loop container。
- 将脚本任务中的 Main 方法替换为
Script Task Code 部分中给出的代码。
- 屏幕截图 #9 显示了包的执行情况。
- 屏幕截图 #10 - #12 显示使用脚本任务代码从 SSIS 导出的文件。
希望对您有所帮助。
SQL 脚本:
CREATE TABLE [dbo].[Source1](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemNumber] [varchar](20) NOT NULL,
[ItemName] [varchar](50) NOT NULL,
CONSTRAINT [PK_Source1] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Source2](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Country] [varchar](20) NOT NULL,
[StateProvince] [varchar](50) NOT NULL,
CONSTRAINT [PK_Source2] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TablesList](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TableName] [varchar](50) NOT NULL,
[FilePath] [varchar](255) NOT NULL,
CONSTRAINT [PK_Tables] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
脚本任务代码:(使用下面给出的代码替换脚本任务中的 Main() 方法)
VBSSIS 2005 and above中可以使用的Main()方法代码:
Public Sub Main()
Dim varCollection As Variables = Nothing
Dts.VariableDispenser.LockForRead("User::TableName")
Dts.VariableDispenser.LockForRead("User::FileName")
Dts.VariableDispenser.LockForRead("User::Delimiter")
Dts.VariableDispenser.GetVariables(varCollection)
Dim fileName As String = varCollection("User::FileName").Value.ToString()
Dim query As String = "SELECT * FROM " & varCollection("User::TableName").Value.ToString()
Dim delimiter As String = varCollection("User::Delimiter").Value.ToString()
Dim writer As StreamWriter = Nothing
Dim connection As OleDbConnection = New OleDbConnection(Dts.Connections("SQLServer").ConnectionString)
Dim command As OleDbCommand = Nothing
Dim reader As OleDbDataReader = Nothing
Try
If File.Exists(fileName) Then
File.Delete(fileName)
End If
connection.Open()
command = New OleDbCommand(query, connection)
reader = command.ExecuteReader()
If reader.HasRows Then
writer = New System.IO.StreamWriter(fileName)
Dim row As Integer = 0
While reader.Read()
Dim header As Integer = 0
Dim counter As Integer = 0
Dim fieldCount As Integer = reader.FieldCount - 1
If row = 0 Then
While header <= fieldCount
If header <> fieldCount Then
writer.Write(reader.GetName(header).ToString() & delimiter)
Else
writer.WriteLine(reader.GetName(header).ToString())
End If
header += 1
End While
End If
While counter <= fieldCount
If counter <> fieldCount Then
writer.Write(reader(counter).ToString() & delimiter)
Else
writer.WriteLine(reader(counter).ToString())
End If
counter += 1
End While
row += 1
End While
End If
Catch ex As Exception
Throw ex
Finally
connection.Close()
writer.Close()
End Try
Dts.TaskResult = ScriptResults.Success
End Sub
屏幕截图 #1:
屏幕截图 #2:
截图#3:
屏幕截图 #4:
屏幕截图 #5:
屏幕截图 #6:
截图#7:
截图#8:
屏幕截图 #9:
屏幕截图 #10:
屏幕截图 #11:
屏幕截图 #12: