2012-01-10 35 views
3

我使用以下命令將數據加載到SQL Server:OPENROWSET - 如何將所有內容讀取爲文本?

INSERT INTO [NewTable] 

SELECT * FROM OPENROWSET 
(
'MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=c:\SomeFolder\;' 
, 'SELECT * from [SomeFile.csv]' 
); 

的問題是,顯然司機試圖猜測每個字段的數據類型,並在轉換失敗它只是讀取空。例如,可以說我有以下

SomeCode SomeName 
100  A 
299  B 
22   C 
123  D 
ABC  E 
900  F 

這似乎身影,「SomeCode」是一個整數,它會顯示「ABC」爲NULL。有什麼辦法可以阻止這種情況的發生?我想要的只是將數據作爲varchars一直處理。

任何想法?

回答

3

看看the second link in my answer on this question有關注冊表項控制如何JET推斷類型。

您可能還想確保ImportMixedTypes鍵設置爲文本。

HKLM\Software\Microsoft\Jet\4.0\Engines\Excel\ImportMixedTypes

您可能必須然而,在Excel別的東西代替。

+0

是我在上面的命令中使用的「Microsoft Text Driver」,與JET在這方面一樣嗎? – Karl 2012-01-10 12:31:08

+0

我相信是的。文本驅動程序被實現爲JET ISAM。 – 2012-01-10 12:42:14

2

它只掃描幾行來確定最可能的數據類型。這是您的場景中的問題。但是,您可以將格式文件與OPENROWSET一起使用。

有關如何在閱讀文本文件時格式化您的FORMATFILE的詳細信息。 http://msdn.microsoft.com/en-us/library/ms191175.aspx

你的情況:

使含有formatfile.xml:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="Col1" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="2" NAME="Col2" xsi:type="SQLNVARCHAR"/> 
</ROW> 
</BCPFORMAT> 

更改您的查詢:

BULK INSERT [newTable] 
FROM 'C:\somefile.csv' 
WITH (formatfile='C:\formatfile.xml'); 
+1

是否可以將格式文件傳入插入命令而不首先將其作爲XML文件創建?我需要實際加載數百個具有不同佈局的文件,以便我可以即時生成上傳過程。也不是真的想創建xml格式文件的hundres。 – Karl 2012-01-10 12:25:16

+0

我想你應該看看下面的答案。根據您的情況更改導入引擎的默認行爲可能會更好。 – cairnz 2012-01-10 12:38:01

0

我花了一段時間來找到了我一直在尋找所以在這裏,因爲這是頂級的成果之一將是:

如果您正在使用Microsoft.ACE.OLEDB並有這個問題,那麼你需要添加選項「IMEX = 1;」 (沒有引號)到數據源。

實施例:

SELECT * INTO #temp FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml;HDR=YES;IMEX=1;Database=P:\Data\FileName.xlsx' ,'SELECT * FROM [Sheet1$A1:BB100]')

這將會讀取混合數據爲文本。 希望這有助於。

相關問題