2011-08-17 1 views
0

SQL Server 2008에서 ID, 실행 위치, 출력 할 spname 및 테이블 내의 각 clientID에 대한 데이터가 포함 된 테이블을 반복하는 데 필요한 SSIS 패키지를 만들었습니다. 저장 프로 시저가 다른 보고서를 출력하고 고객 보고서 용으로 여러 SSIS 패키지를 사용하는 현재 프로세스를 자동화하는 데 필요한 다른 필드를 포함하므로 전체 프로세스를 단순화하고 싶습니다.SSIS 스크립트 작업을 사용하여 여러 저장 프로 시저에서 파일에 데이터를 쓰는 방법은 무엇입니까?

내가 만든 패키지에는 변수 개체에 데이터를 저장하는 SQL 스크립트 구성 요소가 들어 있으며 '각 컨테이너에 대해'개체 변수를 반복하고 데이터를 개별 변수에 저장합니다. 그러나 현재 oledb 연결 관리자에 연결할 수 있으므로 스크립트 작업에 도움이 필요하지만 저장 프로 시저를 실행하려고하면 스크립트 작업이 실패합니다. 뷰 또는 테이블을 통해 데이터가 출력되지 않을 수도 있습니다.

내가 VB.NET 스크립팅에 새로운 오전과 VB.NET의 많은 지식, 내 현재 위치에 도착하는 다음 스레드를 사용하고

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

I로 dbcommand를 교체하는 것이이 없습니다 내 현재 위치를 얻기 위해 다음과 같은 게시물을 사용 :

Exporting data from multiple SQL tables to different flat files using SSIS Script Task

내가 스크립트 작업을 실행할 때, trydbconnection가 열릴 시점에서 실패합니다. 나는 이것을 주석 처리하고 try 섹션없이 스크립트 작업을 실행하려고 시도했지만 오류가 계속 발생했습니다.

+0

오류 메시지가 무엇입니까? –

답변

3

Exporting data from multiple SQL tables to different flat files using SSIS Script Task 질문에 대한 대답으로 제공 한 예제를 사용하고 있으므로 동일한 예제를 사용하여 저장 프로 시저를 실행하도록 수정했습니다.

아무런 문제없이 작동하는 것 같습니다. 그것이 당신이하려고하는 것과 일치하는지 확인하십시오. 이 예에서는 SSIS 2005SQL 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 패키지에

Sample data

는 SQL Server 인스턴스에 연결 관리자를 만듭니다. SSIS 패키지에서

Connection manager

, 즉 Delimiter, FileName, RunSPSPsList 4 개 변수를 생성한다. 또한 아래 스크린 샷과 같이 SQL 실행 태스크, Foreach 루프 컨테이너 및 스크립트 태스크를 제어 흐름 탭에 배치하십시오.

Variables and Control Flow

구성이 스크린 샷 아래에 같이 저장 프로 시저의 목록을 가져 오기 위해 SQL 작업을 실행합니다.

Execute SQL Task Result Set

구성 SPsList 변수에 저장된 결과 세트를 통해 루프 Foreach 루프 컨테이너

Execute SQL Task General

는 다음 두 스크린에 도시 된 바와 같이. 스크립트 작업의 스크립트 섹션에서

Foreach Loop container Variable Mappings

Foreach Loop container Collection

, 버튼 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가 : \ 온도는 이제 개별 저장 프로 시저 SP1 및 SP2에서 제공하는 데이터를 사용하여 패키지 내부의 스크립트 작업에 의해 생성 된 두 개의 파일이 포함되어 있습니다. 파일의

F Temp with files

내용은 아래의 스크린 샷에 표시됩니다. 파일 내용은 파이프로 구분되어 있으며 이전 스크린 샷에 표시된 테이블 데이터와 일치하는 데이터를 볼 수 있습니다.

File 1

File 2

희망하는 데 도움이.

+0

감사합니다. Siva, 정말 빠른 답변이었습니다. 스크립트 태스크가 실패한 이유는 한 번 주석 처리 된 스크립트가 실행되도록 허용하지만 데이터가 있는지 여부에 관계없이 열 머리글을 사용하여 파일을 출력해야하기 때문에 Try and Catch 때문이었습니다. If 문은 "if reader.HasRows Then"과 해당 end "if"문을 주석 처리했으며, 데이터가 없을 때는 파일을 만듭니다. 열 머리글이 계속 나타나는지 확인하는 방법이 있습니까? 덕분에 – Habib

+0

그것은 훌륭하게 작동했습니다 모두 도와 주셔서 감사합니다. – Habib

관련 문제