1

多数のワークシートを含む 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) ....
...

これらのワークシートの 1 つを次の構造のデータベース テーブルにインポートするにはどうすればよいですか?

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

注:私の問題は、行の内容をスキップするだけではなく、列ごとに配置されたデータが行ごとに配置されるようにデータを「ピボット」する方法です。

編集: praveen の回答のおかげで、Select * from [Sheet$A7:AZ13]構文を使用して特定の範囲のセルを使用するという要件を処理できますが、本質的にその側にあるデータをインポートするという主な問題は依然として存在します。

4

3 に答える 3

1

これを試して :-

ステップ 1: 作成中Excel Connection Managerにオプションを選択しますFirst Rows as Column name

ステップ 2: Excel ソースで、最初の行をスキップするクエリを使用SQL Commandして記述します。Data access mode

SELECT * FROM [Sheet1$A7:B]
于 2013-04-23T16:05:00.150 に答える
0

1 つの Excel シートと別の Excel シートの間で変更される可能性のある多くの事柄が存在する可能性があります。したがって、このソリューションは出発点としてのみ使用してください。ご不明な点がございましたら、お気軽にお問い合わせください。(-; 以上の免責事項 ;-)

次のような Excel ファイルを作成しました。

フィールド名 | スワップ ID | 割り当て 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 [プライマリ]

次に、新しい 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
于 2013-04-24T19:20:15.577 に答える
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]
于 2013-04-24T19:29:09.777 に答える