web-dev-qa-db-ja.com

フラットファイルをSqlServerにインポートできません

50個の列と200万行のこのタブ区切りのフラットファイルがあります。 SQL Server 2017 Expressにインポートしようとしています。 (私は最初にExcelでそれを使って試しました...絶望的です。)

SqlServer Management Studioの[フラットファイルのインポート]コマンドと、データのインポートおよびエクスポートウィザードの2つのインポートパスが表示されます。どちらも失敗しますが、方法は異なります。

SSMSを使用すると、ファイルの解析と列タイプの推測は非常にうまく機能するようですが、長さは最初の数百行のみに基づいています。 1列が長いテキストなので、nvarchar(4000)またはnvarchar(max)またはntextに設定してみました。私が知っている他のいくつかは、デフォルトの推定長さの50よりも長い可能性があるため、サイズを大きくしました。しかし、インポートを実行すると、一部の列が切り捨てられるか、変換に失敗することが表示されます問題のある列を示すことは拒否されます

一方、インポートウィザードでは、列の種類はまったく推測されないため、知っている列を手動で設定する必要があります。そしてありがたいことに、変換エラーで失敗するか無視するかを列ごとに指定できる設定があります。しかしこの設定は無視されます-列ごとに、またはグローバルにどのように許容値を設定しても、常に失敗します。

良い部分は、失敗した列名、つまり長いテキスト列を識別することです。しかし、私がそれを測定することができたので、失敗したはずのものが何もありません。値が4000文字を超えているとは思いません(私が見つけた最長は2027です)。文字セットが純粋なascii-7であると確信しています。実際、すべて大文字にする必要があります。

作成したExcelシートをインポートしてみました。 32ビットのインポーターのみがExcelを表示でき、64ビットのインポーターのみが私のデータベースインスタンスを表示できるため、これは阻止されました。

インポートを完了するために、これらのいずれかを取得するにはどうすればよいですか?

2
Paul Kienitz

以前にtsvファイルを使用していて、同様の問題がありました。フラットファイルをインポートする場合は、SQL Serverが列を解釈する方法を変更することをお勧めします https://user-images.githubusercontent.com/35179176/34650736-39eaaab0-f3c6-11e7-9706-377c5f0f1170 .png ↑[DT_TEXT](Unicodeではない)または[DT_WSTR](Unicodeの場合)に変更します。これを変更できるようにするには、[フラットファイルのインポート]オプションではなく、[データのインポート]からインポートする必要があります。

3
Chessbrain

インポートウィザードを使用する代わりに、TSVファイルをSQL Serverに配置し、OPENROWSETを使用して、T-SQLスクリプトを使用してファイルデータを直接読み取ることができます。この方法とSELECT ... INTOを使用すると、ファイル内の実際のデータ型(最大の列など)に基づいてテーブルを作成できます。

詳細は this link を参照してください。

基本的な構文:

SELECT BulkColumn
FROM OPENROWSET (BULK 'c:\temp\mytxtfile.txt', SINGLE_CLOB) MyFile 

documentation をチェックして、行の終端文字などを処理してください。

0
HandyD