2013-04-23 3 views
1

나는 여러 워크 시트가있는 Excel 통합 문서를 가지고 있습니다. 각 워크 시트에는 스키마를 나타내는 데이터가 있습니다. 문제는 데이터가 머리글 행과 함께 배치되지 않고 머리글이 "열" 인 것입니다. 또한 데이터는 시트 즉 :SSIS 가져 오기 첫 번째 열의 열 이름을 사용하여 Excel에서 가져 오기

Field Name | Swap ID  | Allocation ID | Description | Broker ID ... 
Field Type | Alphanumeric| Alphanumeric | Alphanumeric| Alphanumeric ... 
Field Length| char(40) | char(40)  | char(100) | char(50) .... 
... 

가 어떻게 다음과 같은 구조의 데이터베이스 테이블에이 워크 시트 중 하나를 가져 가겠어요 13 행 7에 포함되어 있습니다?

Field Name | Field Type | Field Length | ... 

참고 : 내 문제는 열로 배치되어 내 데이터 대신 행으로 배치되어있는 방식으로에 "피벗"데이터를 행의 콘텐츠를지나 아래로 건너 뛰는,하지만 어떻게되지 .

편집 : 프라 빈의 대답에 덕분에 나는 세포의이 Select * from [Sheet$A7:AZ13] 구문을 사용하여 특정 범위를 사용하기위한 요구 사항을 처리 할 수있는,하지만 기본적으로 옆으로 켜져 데이터를 가져 오기의 주요 문제가 여전히 존재합니다.

답변

1

이 시도 : - : 선택한 옵션을 Excel Connection Manager을 만드는 동안 First Rows as Column name

2 단계 :

1 단계 엑셀 자료 Data access mode에 대한 SQL Command를 사용하여 초기 행을 건너 뛰도록 쿼리를 작성

SELECT * FROM [Sheet1$A7:B] 
+0

행을 건너 뛰는 데 도움이되지만 열을 행으로 변환해야하는 문제에 도움이되지 않습니다. 예를 통해이를 분명하게 알 수없는 경우이를 명확히하기 위해 원래 게시물에 메모를 추가했습니다. – Damian

+1

질문 : 행 13 이후에 시트에 실제 데이터가 FieldName | FieldType | 필드 길이 ....? –

+0

No. 셀 A7 : A13은 열 머리글 정보를 포함하고 셀 B7 : AZ13은 실제 데이터를 포함합니다. – Damian

0

하나의 Excel 시트와 다른 시트 사이에서 잠재적으로 변경 될 수있는 많은 것들이있을 수 있습니다. 따라서이 솔루션은 시작점으로 만 사용하십시오. 질문 사항이 있으면 알려 주시기 바랍니다. - (면책 조항

;-)을 통해 I는 다음과 같습니다 Excel 파일 생성 :

필드 이름을 | 스왑 ID | 할당 ID | 설명 | 중개인 ID

필드 유형 | 영숫자 | 영숫자 | 영숫자 | 영숫자

필드 길이 | char (40) | char (40) | char (100) | 문자는 (50)

  1. 은 Excel에서 준비 테이블 (STG_Sheet1)에 파일을로드합니다.

CREATE TABLE [DBO]. STG_Sheet1] (
[F1]를 varchar NULL [F2]를 varchar NULL [F3]를 varchar NULL [F4]를 varchar NULL [ F5] varchar NULL ) ON [PRIMARY]

이제 새 SSIS 패키지를 만듭니다.

2.1 다음 변수를 만듭니다.

2.1.1 oFieldList; Data type: Object 
2.1.2 sColumn; Data type: String, Value: F2 
2.1.3 sSql; Data type: String, Value: "SELECT " + @[User::sColumn] + " AS COL FROM [dbo].[STG_Sheet1]" 
2.1.4 sSQLInsert; Data type: String 
2.1.5 sValues; Data type: String 

2.2 스크립트 작업을 배치합니다.

2.2.1 Result Set: Full result set 
2.2.2 SQL Statement: 
    SELECT sac.name as ColumnName FROM sys.all_columns sac 
     INNER JOIN sys.all_objects sao ON sao.object_id = sac.object_id 
     WHERE sao.name = 'STG_Sheet1' AND sac.name <> 'F1' 

2.2.3 Result Set: Result Name: 0; Variable Name: User::oFieldList 

2.3 놓습니다 DFT

2.4.1 Place an OLE DB Source 
    2.4.1.1 Data access mode: SQL Command from variable 
    2.4.1.2 Variable name: sSQL 
    2.4.1.3 Columns: COL 

2.4.2 Place a Script component as Transformation 
    2.4.2.1 Input Columns: COL : ReadOnly 
    2.4.2.2 Script: ReadWrite Variables:User::sValues 
    2.4.2.3 Edit Script : Code below 

    public class ScriptMain : UserComponent 
    { 
     string colValue = string.Empty; 

     public override void PreExecute() 
     { 
      base.PreExecute(); 
     } 

     public override void PostExecute() 
     { 
      base.PostExecute(); 

      string x = Variables.sValues; 
      int iFirstCommaAt = colValue.IndexOf (','); 
      colValue = colValue.Substring(iFirstCommaAt + 1); 
      Variables.sValues = colValue; 
     } 

     public override void Input0_ProcessInputRow(Input0Buffer Row) 
     { 
      string x = Row.COL; 
      colValue = string.Format("{0},'{1}'", colValue, x); 
     } 
    } 

2.5 놓습니다 스크립트 작업 Foreach 루프 컨테이너

2.4 장소 내부 Foreach 루프 컨테이너 이제

2.3.1 Enumerator: Foreach ADO Enumerator 
2.3.2 ADO object source variable: User::oFieldList 
2.3.3 Variable Mappings: User::sColumn: 0 

:

2.5.1 ReadOnlyVariables: User::sValues 
2.5.2 ReadWriteVariables: User::sSQLInsert 
2.5.3 Edit Script: Code below 

    public void Main() 
    { 
     string s = "INSERT INTO dbo.SHEET1 ([Field Name], [Field Type], [Field Length]) VALUES "; 

     string sValue = Dts.Variables["User::sValues"].Value.ToString(); 
     string sSQLInsert = string.Empty; 

     Dts.Variables["User::sSQLInsert"].Value = string.Format("{0} ({1})", s, sValue); 

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 

2.6 놓습니다 SQL 실행 태스크

2.6.1 SQLSourceTyoe: Variable 
2.6.2 SourceVariable: User::sSQLInsert 
0

당신은이 실험을 할 수 (당신이 준비 테이블에 엑셀 시트를로드 한 후, SSMS에서 다음 스크립트를 실행합니다

SELECT * FROM [dbo].[STG_Sheet1] 
SELECT * FROM [dbo].[Sheet1] 

DECLARE @CETList2 varchar(300); DECLARE @CETList3 varchar(300); 
DECLARE @CETList4 varchar(300); DECLARE @CETList5 varchar(300); 
DECLARE @INSERT varchar(1000) DECLARE @EXEC_INSERT varchar(1000); 

SET @INSERT = 'INSERT INTO dbo.SHEET1 ([Field Name], [Field Type],[Field Length]) VALUES'; 

SELECT   
    @CETList2 = COALESCE(@CETList2 + ',', '') + '''' + LTRIM(RTRIM(CAST(CETL.[F2] AS Varchar))) + '''' 
    , @CETList3 = COALESCE(@CETList3 + ',', '') + '''' + LTRIM(RTRIM(CAST(CETL.[F3] AS varchar))) + '''' 
    , @CETList4 = COALESCE(@CETList4 + ',', '') + '''' + LTRIM(RTRIM(CAST(CETL.[F4] AS varchar))) + '''' 
    , @CETList5 = COALESCE(@CETList5 + ',', '') + '''' + LTRIM(RTRIM(CAST(CETL.[F5] AS varchar))) + '''' 
FROM [dbo].[STG_Sheet1] CETL 

SET @EXEC_INSERT = @INSERT + '(' + @CETList2 + ')'; 
EXECUTE (@EXEC_INSERT) 

SET @EXEC_INSERT = @INSERT + '(' + @CETList3 + ')'; 
EXECUTE (@EXEC_INSERT) 

SET @EXEC_INSERT = @INSERT + '(' + @CETList4 + ')'; 
EXECUTE (@EXEC_INSERT) 

SET @EXEC_INSERT = @INSERT + '(' + @CETList5 + ')'; 
EXECUTE (@EXEC_INSERT) 

SELECT * FROM [dbo].[Sheet1] 
관련 문제