【问题标题】:SSIS Import from excel with column names in first columnSSIS从excel导入,第一列中的列名
【发布时间】:2013-04-23 15:48:49
【问题描述】:

我有一个 Excel 工作簿,里面有很多工作表。 每个工作表都有代表模式的数据。 问题是数据没有用标题行布局,而是有一个标题“column”。此外,数据仅包含在工作表的第 7 到第 13 行,即:

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 | ...

注意:我的问题不仅仅是跳过行内容,而是如何“透视”数据,以使按列布局的数据由行。

编辑:感谢 praveen 的回答,我能够使用 Select * from [Sheet$A7:AZ13] 语法处理使用特定范围的单元格的要求,但导入数据的主要问题基本上是打开它的侧面仍然存在。

【问题讨论】:

    标签: excel sql-server-2005 import ssis


    【解决方案1】:

    试试这个:-

    第 1 步:在创建 Excel Connection Manager 时选择选项 First Rows as Column name

    第 2 步:在 excel 源代码中使用 SQL Command 表示 Data access mode 并编写查询以跳过初始行

    SELECT * FROM [Sheet1$A7:B]
    

    【讨论】:

    • 这确实有助于跳过行,但它无助于需要将列转换为行的问题(如果我的示例没有立即完成,我在原始帖子中添加了一条注释以澄清这一点很明显)。
    • 问题:在第 13 行之后,表格是否包含 FieldName | 格式的实际数据?字段类型|字段长度....?
    • 没有。单元格 A7:A13 包含列标题信息,单元格 B7:AZ13 包含实际数据。
    【解决方案2】:

    在一张 Excel 工作表和另一张 Excel 工作表之间可能会发生许多变化。因此,仅将此解决方案用作起点。 如果您有任何问题,请告诉我们。 (-; 免责声明 ;-)

    我创建了一个如下所示的 Excel 文件:

    字段名称 |交换ID |分配编号 |说明 |经纪人编号

    字段类型 |字母数字|字母数字 |字母数字|字母数字

    字段长度|字符(40) |字符(40) |字符(100) |字符(50)

    1. 将您的 Excel 文件加载到临时表 (STG_Sheet1) 中。

    创建表 [dbo].[STG_Sheet1] (
    [F1] varchar NULL , [F2] varchar NULL , [F3] varchar NULL , [F4] varchar NULL , [F5] varchar NULL ) 在 [主要] 上

    现在,创建一个新的 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 放置一个 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
    

    现在,在 ForEach 循环容器内

    2.4 放置一个 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 放置脚本任务:

    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
    

    【讨论】:

      【解决方案3】:

      您也可以对此进行试验: (将 Excel 工作表加载到临时表后,从 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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        • 2013-05-15
        相关资源
        最近更新 更多