Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS从excel导入,列名称位于第一列_Excel_Sql Server 2005_Import_Ssis - Fatal编程技术网

SSIS从excel导入,列名称位于第一列

SSIS从excel导入,列名称位于第一列,excel,sql-server-2005,import,ssis,Excel,Sql Server 2005,Import,Ssis,我有一本excel工作簿,里面有很多工作表。 每个工作表都有表示模式的数据。 问题在于,数据不是用标题行排列的,而是有标题“列”。此外,数据仅包含在表的第7至第13行中,即: Field Name | Swap ID | Allocation ID | Description | Broker ID ... Field Type | Alphanumeric| Alphanumeric | Alphanumeric| Alphanumeric ... Field Length| c

我有一本excel工作簿,里面有很多工作表。 每个工作表都有表示模式的数据。 问题在于,数据不是用标题行排列的,而是有标题“列”。此外,数据仅包含在表的第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的回答,我能够使用[Sheet$A7:AZ13]中的
Select*语法处理使用特定范围单元格的要求,但是导入数据的主要问题仍然存在,而数据基本上是从一侧打开的。

尝试以下方法:-

步骤1:创建
Excel连接管理器时
选择选项
第一行作为列名

步骤2:在excel源代码中,对
数据访问模式使用
SQL命令
,并编写查询以跳过初始行

SELECT * FROM [Sheet1$A7:B]
试试这个:-

步骤1:创建
Excel连接管理器时
选择选项
第一行作为列名

步骤2:在excel源代码中,对
数据访问模式使用
SQL命令
,并编写查询以跳过初始行

SELECT * FROM [Sheet1$A7:B]

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

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

字段名称|交换ID |分配ID |描述|代理ID

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

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

  • 将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
    
    现在,在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.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
    

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

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

    字段名称|交换ID |分配ID |描述|代理ID

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

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

  • 将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
    
    现在,在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.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
    

    您还可以尝试以下方法: (将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]
    

    您还可以尝试以下方法: (将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]
    

    这确实有助于跳过行,但对于需要将列转换为行的问题没有帮助(如果我的示例没有立即说明这一点,我在我的原始帖子中添加了一个注释以澄清这一点).问题:在第13行之后,工作表是否以FieldName | FieldType | Field Length…的格式包含实际数据?否。单元格A7:A13包含列标题信息,单元格B7:AZ13包含实际数据。这有助于跳过行,但无助于解决需要将列转换为行的问题(如果我的例子没有立即说明这一点,我在我的原始帖子中添加了一个注释来澄清这一点)。问题:在第13行之后,工作表是否以FieldName | FieldType | Field Length…的格式包含实际数据?否。单元格A7:A13包含列标题信息,单元格B7:AZ13包含实际数据。