我正在使用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行號, 如果不是我應該怎麼做呢?
感謝在這方面的任何幫助/建議。
我可以很容易地將一個標識列添加到臨時表,這會給我行號,我可以用來創建一個連接。我的問題依然存在openrowset以列中的順序寫入數據庫 –
考慮到excel文件的物理約束,讀取將按行順序進行,因此從某種意義上說,寫入也是如此。請注意,在提交發生之前,它可能沒有什麼是實際寫入的。但是,在關係數據庫中,沒有order by子句,沒有訂單可以保證選擇。解釋我的答案時,答案有時會按照書面順序閱讀,但並非總是如此,您無法保證何時。 –