2011-02-08 23 views
11

次のSQLを使用してExcelからデータを読み込みますが、最初はいくつかの行をスキップする必要があります。例えば、実際のデータは5行目から始まるので、最初の4行はスキップする必要があります。openrowset for excel:いくつかの行をスキップできますか?

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=YES;Database=c:\daniel\test.xls', 
    'SELECT * FROM [sheet1$]'); 

答えて

5

これは、(運がそれを持っているように)いない特定の順序で、行が取得されている番号付けされます:あなたが変更することで、フィット感見れば

SELECT * 
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rownum 
    FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=YES;Database=c:\daniel\test.xls', 
    'SELECT * FROM [sheet1$]') 
) s 
WHERE rownum > 4; 

あなたは、いくつかの順序を指定することもできますこのようなrownum定義:

ROW_NUMBER() OVER (ORDER BY specific_column_list) AS rownum 
+0

これは、row_number()を実行するETLプロセスの速度を低下させます。そして、SQL Serverがデータを並列に読み込むことができるかどうかわからない場合、rownumはスレッド1の最初の100行の読み込み、スレッド2の2番目の100行の読み込みなど、ファイル内の位置を反射できません。 2番目の100行が最初にデータベースにロードされました –

+0

@ダニエル・ウー:だから私たちは何を持っていますか?順序付けられたROW_NUMBERを使用すると、プロセスは非常に遅くなる可能性があります。そして、順序付けられていないものは、Excelシートの行の実際の順序とは異なる行番号を割り当てる可能性が非常に高い。そして、私の答えは、この状況ではほとんど完全にごみになります。申し訳ありませんが、私は当面あなたのためのオプションを使い果たしたようです。これだけの場合:元のExcel文書の行に番号を付けることができますか?つまり、実際の行番号を表す値を持つ列を追加すると、SQLでフィルタリングできます。 –

16

使用範囲[シート1の$のA5:Z]の代わりにシート全体の[シート1 $]

SELECT * 
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=YES;Database=c:\daniel\test.xls', 
    'SELECT * FROM [sheet1$A5:Z]' 
); 
+0

行の総数が毎回変更される最後の5行を除外することができますか?私のExcelスプレッドシートには、最後の結果行の後に常に1行だけ開始し、5行になるフッターテキストがあります。しかし、行の数は常に異なっています。現在、フッターテキストをインポートしようとすると、データタイプなどに準拠しているため、インポートが中断されます。 – TravisPUK

関連する問題