2011-02-08 35 views
11

我將使用以下sql從excel中讀取數據,但有時我需要跳過前幾行。例如真正的數據從第5行開始,所以我需要跳過前4行,這是可行的嗎?excel的openrowset:我們可以跳過幾行嗎?

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

這會減慢ETL過程以執行row_number()。我不確定sql server是否可以並行加載數據,如果是這樣的話,rownum不能反映文件中的位置,比如線程1加載前100行,線程2加載第100行,那麼這是可能的第二百行被首先裝入數據庫 – 2011-02-08 23:39:44

+0

@Daniel Wu:那麼我們得到了什麼?有了訂購的ROW_NUMBER,這個過程很可能會放慢,是的。而無序的很可能會分配行號不同於Excel表中的行的實際順序。所以我的回答在這種情況下幾乎變成了垃圾。對不起,我似乎暫時沒有選擇。如果只有這樣的話:你可能可以在原始Excel文檔中對行進行編號嗎?也就是說,添加一個包含表示實際行號的值的列,以便在SQL中篩選它。 – 2011-02-09 00:05:30

16

使用的範圍內[表Sheet 1 $ A5:Z],而不是整個板[表Sheet 1 $]

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