2013-04-23 21 views
1

我有一個excel工作簿,裏面有很多工作表。 每個工作表都有表示模式的數據。 問題是數據不是用一個標題行來佈局的,而是它有一個標題「列」。此外數據僅包含在第7到片即: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行?

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

注:我的問題不只是,蹦蹦跳跳地走過去該行內容,但如何「轉動」中,我是通過列布置的數據,而不是按行制定了這樣的數據。

編輯:由於普利文的回答,我能夠處理要求使用電池的使用Select * from [Sheet$A7:AZ13]語法的具體範圍,但進口其基本上打開其端數據的主要問題依然存在。

回答

1

嘗試這種情況: -

步驟1:在創建Excel Connection Manager選擇選項First Rows as Column name

步驟2:在Excel源使用SQL CommandData access mode和編寫查詢跳過初始行

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

這確實有助於跳過行,但它不能幫助解決需要將列轉換爲行的問題(如果我的示例沒有立即將此顯而易見,我在原始文章中添加了一條註釋以說明此問題)。 – Damian 2013-04-23 16:11:36

+1

問題:在第13行之後,工作表中是否包含格式爲FieldName |的FieldType |字段長度....? – 2013-04-24 00:17:16

+0

編號單元格A7:A13包含列標題信息,單元格B7:AZ13包含實際數據。 – Damian 2013-04-24 12:37:53

0

可能有很多事情可能會在一個Excel工作表和另一個Excel工作表之間發生變化。因此,只能將此解決方案用作開始點。 如果您有任何問題,請告訴我們。 ( - ;在免責聲明;-)

我創建了一個看起來像這樣的Excel文件:

字段名稱|交換ID |分配ID |說明|經紀人編號

字段類型|字母數字|字母數字|字母數字|字母數字

字段長度| char(40)| char(40)| char(100)| CHAR(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放置一個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 
0

您也可以嘗試使用此: (已加載的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]