Exporting data from multiple SQL tables to different flat files using SSIS Script Task 질문에 대한 대답으로 제공 한 예제를 사용하고 있으므로 동일한 예제를 사용하여 저장 프로 시저를 실행하도록 수정했습니다.
아무런 문제없이 작동하는 것 같습니다. 그것이 당신이하려고하는 것과 일치하는지 확인하십시오. 이 예에서는 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 패키지에서
, 즉
Delimiter
,
FileName
,
RunSP
및
SPsList
4 개 변수를 생성한다. 또한 아래 스크린 샷과 같이 SQL 실행 태스크, Foreach 루프 컨테이너 및 스크립트 태스크를 제어 흐름 탭에 배치하십시오.
구성이 스크린 샷 아래에 같이 저장 프로 시저의 목록을 가져 오기 위해 SQL 작업을 실행합니다.
구성 SPsList 변수에 저장된 결과 세트를 통해 루프 Foreach 루프 컨테이너
는 다음 두 스크린에 도시 된 바와 같이. 스크립트 작업의 스크립트 섹션에서
, 버튼 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가 : \ 온도는 이제 개별 저장 프로 시저 SP1 및 SP2에서 제공하는 데이터를 사용하여 패키지 내부의 스크립트 작업에 의해 생성 된 두 개의 파일이 포함되어 있습니다. 파일의
내용은 아래의 스크린 샷에 표시됩니다. 파일 내용은 파이프로 구분되어 있으며 이전 스크린 샷에 표시된 테이블 데이터와 일치하는 데이터를 볼 수 있습니다.
희망하는 데 도움이.
오류 메시지가 무엇입니까? –