3

次のコマンドを使用して、SQLServerにデータをロードしています。

INSERT INTO [NewTable]

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

問題は、明らかにドライバーが各フィールドのデータ型を推測しようとし、キャストが失敗した場合は単にnullを読み取ることです。たとえば、次のようなものがあるとします。

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

「SomeCode」は整数であり、「ABC」はNULLとして読み取られるようです。これを防ぐ方法はありますか?私が欲しいのは、データがずっとvarcharsとして扱われることです。

何か案は?

4

4 に答える 4

3

JETが型を推測する方法を制御するレジストリキーに関するこの質問に対する私の回答の2番目のリンクを見てください。

ImportMixedTypesキーがTextに設定されていることを確認することもできます。

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

ただし、代わりに別のものを使用する必要がある場合がありExcelます。

于 2012-01-10T12:06:25.167 に答える
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');
于 2012-01-10T12:03:29.867 に答える
1

探していたものを見つけるのに少し時間がかかりました。これは上位の結果の1つであるため、ここに追加します。

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]')

これにより、混合データがテキストとして読み取られます。お役に立てれば。

于 2016-11-21T23:14:58.380 に答える
0

この問題を解決するためのショートカットは、「HDR=No」を使用することです。この場合、ヘッダーdatatType(Text)のため、列のデフォルト値はテキストになります。最後に、ヘッダー行を単純にフィルタリングできます。あなたの場合:

INSERT INTO [NewTable]

SELECT * FROM OPENROWSET 
(
'MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=c:\SomeFolder\;'
;HDR=Noe, 'SELECT * from [SomeFile.csv]'
)where [F1] <> 'SomeCode';
于 2019-07-03T13:17:12.897 に答える