2010-07-13 71 views
0

我需要將excel表格上傳到數據庫。對此我與查詢excel表格上傳到sqlserver的問題

SELECT * INTO temp FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=C:\Dokumente und Einstellungen\l.varada\Desktop\BA-Control.xls', 
    'SELECT * FROM [qry_BA_Controlling (Report)$]') 

其中,C做:\ Dokumente UND Einstellungen \ l.varada \桌面\ BA-Control.xls是從哪兒Excel文件需要獲取的路徑。 qry_BA_Controlling(Report)是工作表的名稱。

因此,在執行查詢時,會創建一個名稱爲「temp」的表。隨着從Excel中填充的記錄。

現在我在excel中有一個日期字段。有時這個字段的值沒有正確地上傳到臨時表中。儘管它們在EXCEL中具有值,但此日期字段的值仍設置爲NULL。

EDIT 我已經修改我的查詢,以便,

Insert into temp Select * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\Dokumente und Einstellungen\l.varada\Desktop\BA-Control.xls', 
    HDR=YES', 'SELECT * FROM [qry_BA_Controlling (Report)$]') 

這裏溫度是一個已有的表,我已定義的字段[創建日期]的日期類型爲varchar和上傳的Excel中。然後我用轉換的數據類型更改爲正確的格式..

update temp set [Creation date] = CONVERT (varchar,[Creation date],101) 

即使是現在它被填充NULL values..Or這種轉換需要在上傳工作要做。如果是這樣,請讓我知道。

我認爲這背後的原因是,這一列的前幾個值是空格,之後它有值..因爲它通過檢查前幾行確定數據類型..然後它是分配NULL ..請提示我是另一種選擇。

+0

您是否嘗試過使用GUI?我以前在openrowsets中遇到了很多問題,GUI很快就被修復了。 – 2010-07-13 10:28:47

+0

我在網上搜索到使用GUI將excel數據導入到sql server。它將我路由到某些需要支付的共享軟件代碼。 能否請您詳細解釋或請給我一個鏈接。 – satya 2010-07-13 14:36:14

+0

只是谷歌「SQL服務器數據導入/導出嚮導」;) 例如,請參閱:http://www.databasejournal.com/features/mssql/article.php/3580216/SQL-Server-2005-Import-- Export-Wizard.htm – 2010-07-14 10:54:19

回答

0

我修改了查詢,現在可以從excel中導入數據。 (''Microsoft.Jet.OLEDB.4.0'',' ''Excel 8.0; Database ='+ @ba_bm_status +'; HDR = YES; IMEX = 1'')(EXEC('SELECT * INTO temp FROM OPENROWSET'''''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0; Database ='+ @ba_bm_status +'; ,'+ '''SELECT * FROM [qry_BA_Controlling(Report)$]'')');

我已經包含IMEX = 1,它告訴驅動程序使用導入模式。

0

首先要小心這種方法不適用於SQL Server的x64版本,因爲沒有可用的x64 MS Excel驅動程序。我看到有人在32位上編寫某些東西,然後在生產環境中部署到x64時被這個問題困擾。

您正在使用SELECT INTO,我認爲這意味着Excel驅動程序正在查看前100行(或類似)並確定此字段是日期。

我認爲最有可能的是SQL Server然後獲取日期格式錯誤,您可能會發現NULL值是不符合美國日期時間格式。所以我們(歐洲人)會接受31/7/2010,但這是不可接受的MM/DD/YYYY格式。

我的建議是預先定義所有字段爲int,float或varchar的臨時表。然後手動將它們(使用視圖,如果方便的話)轉換爲正確的類型。如果我對日期格式是正確的,可以使用CONVERT函數強制使用正確的日期格式。

+0

非常感謝回覆!請看看編輯過的問題,讓我知道我是否可以做更多的事情。 – satya 2010-07-13 13:08:36

+0

好的,越來越近。很難在沒有看到數據的情況下進行猜測,但我認爲你的CONVERT語句是錯誤的。 update temp set [創建日期] = CONVERT(datetime,[CreationDateAsVarChar],101) 您應該將Excel文件插入到所有字段均爲varchar的表中。然後將它們轉換爲具有正確類型的單獨表格。 – 2010-07-15 00:07:28