2015-05-07 66 views
1

我正在使用MS SQL 2012閱讀Excel工作表(excel 2010)。 Excel工作表可能具有可變數量的列和可變模式,其範圍可以從一百到幾千。我需要將每條記錄讀入臨時表,然後對其進行標準化。我開始使用OPENROWSET這OpenRowset Excel閱讀順序

> Insert into #temp FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
>  'Excel 12.0;HDR=YES;Database=c:\dir\test.xlsx', 
>  'SELECT * FROM [sheet1$]'); 

我很快意識到,這種做法讓我一氣呵成讀的最大列數爲255。一些快速研究reviles,這是驅動程序的限制「 Microsoft.ACE.OLEDB.12.0' 。所以,當我有大量列(> 255)的Excel文件時,這種方法失敗了。除了加載之外,單個表中的列可能會造成另一個超過表格8060頁面大小限制的問題。所以我改變了我的方法,並決定做多次讀取並循環openrowset命令,以便它一次讀取200列,並將其加載到臨時表中。我可以通過附加的Excel列範圍表名稱[工作表Sheet1 $ A:GR]指定範圍命令會是什麼樣子

> Insert into #temp01 FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
>  'Excel 12.0;HDR=YES;Database=c:\dir\test.xlsx', 
>  'SELECT * FROM [sheet1$A:GR]'); 

有一次,我把它放在適當的循環,我能讀整個Excel表格並創建幾個臨時表格,這些表格放在一起會給我所有的列。爲了將這些臨時表放在一起得到一個完整的記錄,我打算使用一個Join和一個視圖,這裏是我偶然發現的一個問題。

  • 將從OPENROWSET維持讀出順序,從而記錄一個在Excel 將是我創建的所有臨時表記錄1等所有其他 記錄?
  • 如果訂單保持不變,我可以簡單地加入SQL行號, 如果不是我應該怎麼做呢?

感謝在這方面的任何幫助/建議。

回答

1

表中沒有行的「順序」的真實概念。除非向select中添加ORDER BY子句,否則不能保證任何select將顯示結果。

也就是說,如果沒有ORDER BY,一個簡單的選擇將一般把排在後面,他們加入,但有這麼多的東西去成,這是沒有辦法保證的順序。

最好的辦法是爲每個臨時表添加一個int列,行。在其中放入源數據的Excel行號,然後可以確定數據的每一位來自哪行,並使用源Excel行將臨時表中的數據匹配。

+0

我可以很容易地將一個標識列添加到臨時表,這會給我行號,我可以用來創建一個連接。我的問題依然存在openrowset以列中的順序寫入數據庫 –

+1

考慮到excel文件的物理約束,讀取將按行順序進行,因此從某種意義上說,寫入也是如此。請注意,在提交發生之前,它可能沒有什麼是實際寫入的。但是,在關係數據庫中,沒有order by子句,沒有訂單可以保證選擇。解釋我的答案時,答案有時會按照書面順序閱讀,但並非總是如此,您無法保證何時。 –