25

テキストファイルをデータベースにインポートしようとすると、変換エラーが発生します。以下は私が受け取ったエラーメッセージです:

行1、列4(年)のバルクロードデータ変換エラー(指定されたコードページのタイプの不一致または無効な文字)。

これが私のクエリコードです:

CREATE TABLE Students
(
    StudentNo    Integer NOT NULL Primary Key,
    FirstName    VARCHAR(40) NOT NULL,
    LastName     VARCHAR(40) NOT NULL,
    Year         Integer,
    GPA          Float NULL
);

テキストファイルのサンプルデータは次のとおりです。

100,Christoph,Van Gerwen,2011
101,Anar,Cooke,2011
102,Douglis,Rudinow,2008

私は問題が何であるかを知っていると思います..以下は私の一括挿入コードです:

use xta9354
bulk insert xta9354.dbo.Students
from 'd:\userdata\xta9_Students.txt' 
with (fieldterminator = ',',rowterminator = '\n') 

サンプルデータでは、Year属性の後に'、'はありませんが、Yearの後にNULLである別の属性Gradeがあります。

誰かがこれを修正する方法を教えてもらえますか?

4

6 に答える 6

27

データファイルには4列しかないため、フォーマットファイルを使用してみてください。それ以外の場合はOPENROWSET、ステージングテーブルを使用してみてください。

myTestFormatFiles.Fmt次のようになります。

9.0
4
1 SQLINT 0 3 "、" 1 StudentNo ""
2 SQLCHAR 0 100 "、" 2 FirstName SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 100 "、" 3 LastName SQL_Latin1_General_CP1_CI_AS
4 SQLINT 0 4 "\ r \n"4年"


(ソース:microsoft.com

で列をスキップするこのチュートリアルBULK INSERTも役立つ場合があります。

その場合、ステートメントは次のようになります。

USE xta9354
GO
BULK INSERT xta9354.dbo.Students
    FROM 'd:\userdata\xta9_Students.txt' 
    WITH (FORMATFILE = 'C:\myTestFormatFiles.Fmt')
于 2012-10-24T20:54:25.360 に答える
14

私の場合、Linuxボックスでhadoopによって生成されたファイルを扱っていました。SQLにインポートしようとすると、この問題が発生しました。修正の結果、「改行」0x0aに16進値を使用することになりました。バルクインサートにも使用できます

bulk insert table from 'file' 
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a')
于 2016-08-18T16:10:25.347 に答える
3

バルクインサートも使用しています。アップロードするファイルは外部から送信されたものです。しばらくトラブルシューティングを行った後、ファイルにコンマが含まれる列があることに気付きました。探すべきもう一つのこと...

于 2018-09-25T15:14:31.280 に答える
1

上記のオプションは、GoogleのBigQueryファイルでも機能します。テーブルデータをgoodleクラウドストレージにエクスポートし、そこからダウンロードしました。同じものをSQLサーバーにロードしているときにこの問題が発生し、行区切り文字を次のように指定した後、ファイルを正常にロードできました。

ROWTERMINATOR = '0x0a' 

ヘッダーレコードにも注意して指定します

FIRSTROW = 2

googlebigqueryからのデータファイルエクスポートの最後のブロックは次のようになります。

BULK INSERT TABLENAME
        FROM 'C:\ETL\Data\BigQuery\In\FILENAME.csv'
        WITH
        (
         FIRSTROW = 2,
         FIELDTERMINATOR = ',',  --CSV field delimiter
         ROWTERMINATOR = '0x0a',--Files are generated with this row terminator in Google Bigquery
         TABLOCK
        )
于 2018-05-01T06:47:55.120 に答える
1

フォルダ、diskadmin、bulkadminサーバーの役割へのMSSQLSERVERフルアクセスを追加しました。

私のc#アプリケーションでは、一括挿入コマンドの準備をするときに、

string strsql = "BULK INSERT PWCR_Contractor_vw_TEST FROM '" + strFileName + "' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\\n')";

そして、このエラーが発生します-行1、列8(STATUS)のバルクロードデータ変換エラー(指定されたコードページのタイプの不一致または無効な文字)。

ログファイルを調べたところ、ターミネータが「\n」ではなく「」になっていることがわかりました。リンクサーバー"(null)"のOLEDBプロバイダー"BULK"がエラーを報告しました。プロバイダーはエラーに関する情報を提供しませんでした:

Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)". Query :BULK INSERT PWCR_Contractor_vw_TEST FROM 'G:\NEWSTAGEWWW\CalAtlasToPWCR\Results\parsedRegistration.csv' WITH (FIELDTERMINATOR = ',', **ROWTERMINATOR = ''**)

そこで、行ターミネーターにエスケープを追加しました--string strsql = "BULK INSERT PWCR_Contractor_vw_TEST FROM'" + strFileName + "'WITH(FIELDTERMINATOR ='、'、ROWTERMINATOR ='\\ n')";

そして今、それは正常に挿入されます。

Bulk Insert SQL -   --->  BULK INSERT PWCR_Contractor_vw_TEST FROM 'G:\\NEWSTAGEWWW\\CalAtlasToPWCR\\Results\\parsedRegistration.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')
Bulk Insert to PWCR_Contractor_vw_TEST successful...  --->  clsDatase.PerformBulkInsert
于 2019-02-23T21:35:20.717 に答える
0

私の推測では、これはエンコーディングの問題です。たとえば、ファイルはUTF-8ですが、SQLは正しく読み取れないため、これらの行に沿って100ÿなどをテーブルに挿入しようとします。

考えられる修正:

  1. コードページを指定する
  2. Powershellを使用してソースのエンコーディングを変更する

コードサンプル:

1.
BULK INSERT myTable FROM 'c:\Temp\myfile.csv' WITH (
  FIELDTERMINATOR = '£',
  ROWTERMINATOR = '\n',
  CODEPAGE = 'ACP' -- ACP corresponds to ANSI, also try UTF-8 or 65001 for Unicode
);

2.
get-content "myfile.csv" | Set-content -Path "myfile.csv" -Encoding String
# String = ANSI, also try Ascii, Oem, Unicode, UTF7, UTF8, UTF32
于 2020-06-23T10:26:25.323 に答える