Поскольку вы использовали пример, который я предоставил в качестве ответа на вопрос Экспорт данных из нескольких таблиц 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
Данные в таблицах будут выглядеть так, как показано ниже на скриншоте.

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

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

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


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


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

Замените код 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 теперь содержит два файла, которые были сгенерированы Задачей сценария внутри пакета с использованием данных, предоставленных отдельными хранимыми процедурами SP1 и SP2.

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


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