2009-08-26 29 views
6

正在調查一段時間,並繼續打磚牆。我通過OpenRowset命令從xls文件導入臨時表。現在我有一個問題,我試圖導入某個列有一個範圍值,但最常見的是以下內容。結構爲長數字的列,即15598和一些列作爲字符串,即15598-E。TSQL中的OpenRowSet命令返回NULLS

現在openrowset正在讀取字符串版本沒有問題,但報告數字版本爲NULL。我讀了(http://www.sqldts.com/254.aspx)openrowset有這個問題,作者說在查詢字符串中實現「HDR = YES; IMEX = 1」,但這根本不適用於我。

有沒有你們每個人都遇到過這個?

只是一些更多的信息以及。我可能不會與JET引擎(Microsoft.Jet.OLEDB.4.0)做到這一點,所以這是我的查詢是什麼樣子:

SELECT * 
FROM 
    OPENROWSET('MSDASQL' 
       , 'Driver=Microsoft Excel Driver (*.xls);HDR=YES;IMEX=1;DBQ=C:\ImportFile.xls;' 
      , 'SELECT * FROM [Sheet1$]') 
+2

現在你知道ETL人爲什麼討厭Excel導入! – HLGEM 2009-08-26 18:26:41

回答

6

我注意到您正在使用Excel ODBC驅動程序。您是否使用等效連接字符串嘗試了JET OLEDB提供程序?

select * from openrowset(
    'Microsoft.Jet.OLEDB.4.0', 
    'Data Source=C:\ImportFile.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"', 
    'SELECT * FROM [Sheet1$]') 

編輯:對不起,剛纔注意到你的最後一段。當然,Excel ODBC驅動程序仍然通過JET引擎,所以它會有什麼不同?

編輯:我看了KB194124鏈接,它建議的註冊表值是我的機器上的默認值,我從來沒有改變過。我自己多次使用了上述方法,沒有任何問題。也許這是一個環境問題?

+0

沒有問題,請查看http://stackoverflow.com/questions/1178243/what-is-the-difference-between-odbc-and-oledb瞭解更多信息 – StevenMcD 2009-08-26 12:43:13

+0

謝謝!對此,我真的非常感激! – StevenMcD 2009-08-26 13:02:19

+0

+1。在發佈一年後,它爲我解決了同樣的問題。 – 8kb 2010-10-22 20:24:40

1

我們已經遇到了同樣的問題。不幸的是,我們還沒有找到解決方案。還有更多信息here這表明可能存在註冊表修復程序。

+0

很酷,感謝您的鏈接 – StevenMcD 2009-08-26 12:39:25

2

如果你不介意打開Excel中的文件,採取有問題的列,選擇列,並做

數據 - >文本到列 - >下一步 - >下一步 - >正文

保存電子表格和他們都應該進來的文本在OPENROWSET

我一直在使用。CSV文件,而不是Excel中,通過設置鏈接服務器,並設置文件的格式打開發現在schema.ini中更像一種更實用的方法來處理像這樣的導入,您可以使用該方法進行說明tly選擇每列的格式。

0

我有同樣的問題。我修復了它在表格的第一行位置剪切並粘貼一行,其中包含一個帶有字符串/數字值的列(例如123ABC)。出於某種原因,T-SQL讀取第一行並假定所有值都是數字。在這個環節

0

響應由SqlACID偉大的工作[https://wikigurus.com/Article/Show/185717/OpenRowSet-command-in-TSQL-is-returning-NULLS]: -

如果你不介意打開Excel中的文件,採取有問題的列,選擇列,並做

數據 - >文本到列 - >下一步 - >下一步 - >正文

保存電子表格和他們都應該進來的文本在OPENROWSET

我一直在使用。CSV文件,而不是Excel中發現,通過開設置鏈接服務器,並在schema.ini中設置文件格式是一種更實用的方法來處理像這樣的導入,通過該方法,您可以明確地選擇每個列的格式。