Вот возможный способ экспорта таблиц различной структуры в плоский файл, используя Script Task
.В этом примере будут экспортированы две таблицы, содержащие разные поля и данные, в плоский файл с помощью задачи «Сценарий».Чтобы экспортировать данные, вы можете использовать DataReader
вместо DataGrid
.Могут быть и другие возможные способы сделать это.
Пошаговый процесс:
- Создайте три таблицы с именами
dbo.TablesList
, dbo.Source1
и dbo.Source2
, используя сценарии, указанные в SQL Scripts section. - Заполните таблицы
dbo.TablesList
, dbo.Source1
и `dbo.Source2`` данными, показанными на скриншоте # 1 . - В пакете служб SSIS
Connection manager
создайте OLE DB connection
с именем SQLServer для подключения к экземпляру SQL Server, как показано на снимке экрана # 2 . - Впакет, создайте 4 переменные, как показано на скриншоте # 3 .
- В потоке управления поместите
Execute SQL Task
, Foreach Loop Container
и Script Task
в Foreach loop container
какпоказано на скриншоте # 4 . - Сконфигурируйте
Execute SQL task
как показано на скриншотах # 5 и # 6 . - Настройте
Foreach Loop container
, как показано на скриншотах # 7 и # 8 . - Замените метод Main в задаче сценария на код, указанный в разделе
Script Task Code
. - Снимок экрана # 9 sВыполнение пакета hows.
- Снимки экрана # 10 - # 12 показывают файлы, экспортированные из SSIS с использованием кода задачи скрипта.
Надеюсь, чтоhelp.
Сценарии 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 () взадание сценария)
VB Код метода Main (), который можно использовать в SSIS 2005 and above
:
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:
