2013-04-23 7 views
1

У меня есть книга Excel, в которой есть многочисленные рабочие листы. Каждый лист имеет данные, которые представляют собой схему. Проблема в том, что данные не выложены со строкой заголовка, но вместо этого он имеет заголовок «column». Также данные содержатся только в 7-го по 13-й строке листа .: т.е.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) .... 
... 

Как бы я идти об импорте один из этих рабочих листов в таблицу базы данных со следующей структурой?

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

ПРИМЕЧАНИЕ: Моя проблема не только пропуск вниз мимо содержимого строки, но как «Стержень» данные таким образом, что мои данные, которые выложенные колоннами вместо выложенных рядов ,

Edit: Благодаря ответу Praveen, я могу справиться с требованием для использования определенного диапазона клеток, используя синтаксис Select * from [Sheet$A7:AZ13], но главная проблема импорта данных, которые, по существу, превратились на его стороне все еще существует.

ответ

1

Попробуйте это: -

Шаг 1: При создании Excel Connection Manager выберите опцию First Rows as Column name

Шаг 2: В источнике первенствовать использовать SQL Command для Data access mode и написать запрос, чтобы пропустить начальные строки

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

Это помогает с пропуском строк, но это не помогает с проблемой необходимости преобразовывать столбцы в строки (я добавил примечание к своему первоначальному сообщению, чтобы прояснить это, если мой пример не сделал это сразу очевидным). – Damian

+1

Вопрос: После строки 13, листы содержат фактические данные в формате FieldName | FieldType | Длина поля ....? –

+0

№ Клетки A7: A13 содержат информацию заголовка столбца и ячейки B7: AZ13 содержат фактические данные. – Damian

0

Может быть много вещей, которые могут потенциально измениться между одним листом Excel и другим. Таким образом, используйте это решение только в качестве начальной точки. Если у вас есть вопросы, пожалуйста, сообщите нам. (-; Disclaimer над ;-)

Я создал файл Excel, который выглядит следующим образом:

Имя поля | Обменный 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 [ПЕРВИЧНО]

Теперь создайте новый пакет 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 Поместите цикл по каждому элементу Контейнер

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.4 Место ДПФ

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 Поместите задачу сценария:

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 Поместите Execute SQL Task

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

Вы также можете поэкспериментировать с этим: (После того, как вы загрузили лист Excel в промежуточной таблице, запустите следующий сценарий из ВСС:

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] 
Смежные вопросы