Как записать данные из нескольких хранимых процедур в файлы, используя задачу скрипта SSIS? - PullRequest
0 голосов
/ 17 августа 2011

Я создал пакет служб SSIS в SQL Server 2008, который необходим для итерации по таблице, содержащей идентификатор, расположение выходных файлов, исполняемое spname и данные для каждого clientID в таблице.Хранимые процедуры выводят разные отчеты и содержат разные поля, это необходимо для автоматизации текущего процесса использования нескольких пакетов служб SSIS для отчетов клиентов. Я хочу упростить весь процесс.

Пакет, который я создал, содержит SQLКомпонент сценария, который сохраняет данные в объекте переменной, «для каждого контейнера» выполняет итерацию по переменной объекта и сохраняет данные в отдельных переменных.Однако мне требуется помощь с задачей сценария, так как в настоящее время я могу подключиться к диспетчеру соединений oledb, однако задача сценария завершается неудачно при попытке выполнить хранимую процедуру, возможно, поскольку данные не выводятся через представление или таблицу.

Я новичок в сценариях VB.NET и не очень разбираюсь в VB.NET, я использовал следующий поток, чтобы перейти на свою текущую позицию, и заменил команду db на

Dim query As String = "Exec " & Dts.Variables("User::RunSP").Value

, которую я использовалследующая запись, чтобы добраться до моей текущей позиции:

Экспорт данных из нескольких таблиц SQL в разные плоские файлы с помощью задачи сценария SSIS

Когда я выполняю задачу сценария, онатерпит неудачу в точке, где try и dbconnection открыты.Я попытался закомментировать это и запустить задачу сценария без раздела try, но он продолжал выдавать ошибку.

1 Ответ

3 голосов
/ 18 августа 2011

Поскольку вы использовали пример, который я предоставил в качестве ответа на вопрос Экспорт данных из нескольких таблиц SQL в разные плоские файлы с помощью задачи сценария SSIS , я взял тот же пример и изменил его, чтобы запустить сохраненныйпроцедура.

Кажется, работает без проблем.Убедитесь, что это соответствует тому, что вы пытаетесь сделать.В этом примере используется SSIS 2005 с SQL Server 2008 R2 базой данных.

Пошаговый процесс :

Создайте три таблицы, а именно dbo.TablesList, dbo.Source1 и dbo.Source2.Заполните таблицы некоторыми примерами данных.Также создайте две хранимые процедуры с именами dbo.SP1 и dbo.SP2.Ниже приведенные сценарии выполняют эти задачи для создания таблиц и хранимых процедур.

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,
    [SPName] [varchar](50) NOT NULL,
    [FilePath] [varchar](255) NOT NULL,
CONSTRAINT [PK_Tables] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

INSERT INTO dbo.TablesList (FilePath, SPName) VALUES 
    ('F:\Temp\Item_Details.txt', 'SP1'),
    ('F:\Temp\Country_StateProvince.txt', 'SP2');
GO

INSERT INTO dbo.Source1 (ItemNumber, ItemName) VALUES 
    ('34534', 'Keyboard'),
    ('24312', 'Mouse'),
    ('78555', 'Monitor');
GO

CREATE PROCEDURE [dbo].[SP1]
AS
BEGIN   
    SET NOCOUNT ON;

    SELECT * FROM dbo.Source1
END
GO

CREATE PROCEDURE [dbo].[SP2]
AS
BEGIN   
    SET NOCOUNT ON;

    SELECT * FROM dbo.Source2
END
GO

Данные в таблицах будут выглядеть так, как показано ниже на скриншоте.

Sample data

В пакете служб SSIS создайте диспетчер соединений с экземпляром SQL Server.

Connection manager

В пакете служб SSIS создайте 4 переменные, а именно Delimiter, FileName, RunSP и SPsList.Кроме того, поместите задачу «Выполнение SQL», контейнер «цикл по каждому элементу» и задачу «Сценарий» на вкладке «Поток управления», как показано на снимке экрана ниже.

Variables and Control Flow

Настройте задачу «Выполнение SQL» для получения спискахранимых процедур, как показано на следующих двух снимках экрана.

Execute SQL Task General

Execute SQL Task Result Set

Сконфигурируйте контейнер цикла по каждому элементу для циклического просмотра набора результатов, хранящегося в переменнойSPsList, как показано на следующих двух снимках экрана.

Foreach Loop container Collection

Foreach Loop container Variable Mappings

В разделе «Сценарий» задачи «Сценарий» нажмите кнопку «Сценарий разработки ...», чтобыпринесите редактор VSTA.

Script Task

Замените код VB.NET приведенным ниже кодом.После вставки кода закройте редактор VSTA, чтобы сохранить изменения.

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.IO
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime

Public Class ScriptMain

    Public Sub Main()

        Dim varCollection As Variables = Nothing

        Dts.VariableDispenser.LockForRead("User::FileName")
        Dts.VariableDispenser.LockForRead("User::Delimiter")
        Dts.VariableDispenser.LockForRead("User::RunSP")
        Dts.VariableDispenser.GetVariables(varCollection)

        Dim fileName As String = varCollection("User::FileName").Value.ToString()
        Dim query As String = "EXEC " & varCollection("User::RunSP").Value.ToString()
        Dim delimiter As String = varCollection("User::Delimiter").Value.ToString()

        Dim writer As StreamWriter = Nothing
        Dim connection As OleDbConnection = New OleDbConnection(Dts.Connections("Learn2008R2").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()

            writer = New System.IO.StreamWriter(fileName)

            Dim row As Integer = 0
            Dim header 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

            If reader.HasRows Then
                While reader.Read()
                    Dim counter As Integer = 0
                    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
                End While
            End If
        Catch ex As Exception
            Throw ex
        Finally
            connection.Close()
            writer.Close()
        End Try

        Dts.TaskResult = Dts.Results.Success

    End Sub

End Class

Содержимое папки F: \ Temp перед выполнением пакета.Папка пуста.

F Temp empty

Успешное выполнение пакета показано на снимке экрана ниже.

Success

Путь к папке F: \Temp теперь содержит два файла, которые были сгенерированы Задачей сценария внутри пакета с использованием данных, предоставленных отдельными хранимыми процедурами SP1 и SP2.

F Temp with files

Отображается содержимое файловна скриншотах ниже.Содержимое файла разделено каналом, и вы можете заметить, что данные совпадают с данными таблицы, показанными на предыдущем снимке экрана.

File 1

File 2

Надеюсь, что это поможет.

...