web-dev-qa-db-ja.com

SQLはBULKINSERTでNULL値を挿入しません

CSVファイルがあり、各行は次のようになります。

EASTTEXAS,NULL,BELLVILLE AREA,NULL,BELLVILLE AREA,RGP,NULL,NULL,0,NULL,NULL,NULL,1,1,PM,PM Settings,NULL,NULL

BULK INSERTを実行するときにNULL値がどのように処理されるかについての例が見つからなかったので、それで問題ないと思いました。

BULK INSERTを実行しようとすると、次のエラーが発生します。

メッセージ4864、レベル16、状態1、行28バルクロードデータ変換エラー(指定されたコードページのタイプの不一致または無効な文字)、行1、列12(ClassificationPK)。

これが私のテーブルです。

CREATE TABLE #Assets
(
ParentID VARCHAR(255) NULL,
ClassificationID VARCHAR(255) NULL,
AssetID VARCHAR(255) NULL,
AssetType VARCHAR(255) NULL,
AssetName VARCHAR(255) NULL,
RepairCenterID VARCHAR(255) NULL,
LaborID VARCHAR(255) NULL,
Owner VARCHAR(255) NULL,
IsLocation VARCHAR(255) NULL,
AssetTypeDesc VARCHAR(255) NULL,
ClassificationName VARCHAR(255) NULL,
ClassificationPK INT NULL,
IsUp BIT NULL,
RequesterCanView BIT NULL,
PMCycleStartBy VARCHAR(255) NULL,
PMCycleStartByDesc VARCHAR(255) NULL,
PMCycleStartDate DATETIME NULL,
PMCounter INT NULL,
ParentPK INT NULL,
ParentName VARCHAR(255) NULL,
AssetPK INT NULL,
RepairCenterPK INT NULL,
RepairCenterName VARCHAR(255) NULL,
LaborPK INT NULL)

BULK
INSERT #Assets
FROM '\\cdmsqlint01\drop\assets.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
KEEPNULLS
)
GO

SELECT * FROM #Assets

DROP TABLE #Assets

私がここで間違っていることについて何か考えはありますか?

8
ernest

による:

http://msdn.Microsoft.com/en-us/library/ms187887.aspx

ファイル内に空のフィールドを含めると、null値を挿入できます。

サンプルファイルは次のとおりです。

1,,DataField3
2,,DataField3

Nullを保持するファイルをインポートする方法の例は次のとおりです。

USE AdventureWorks;
GO
BULK INSERT MyTestDefaultCol2
FROM 'C:\MyTestEmptyField2-c.Dat'
WITH (
    DATAFILETYPE = 'char',
    FIELDTERMINATOR = ',',
    KEEPNULLS
);
GO

確かに、これは「NULL」を「」に変更する必要があることを意味し、空の文字列として必要な空の文字列はnullとして解釈されますが、開始するには十分かもしれません。空の文字列列を変更する必要があると思います

field1,,field2

field1,"",field2

例として

14
Kritner

遅いPS。

最後の列[〜#〜] datetime [〜#〜]タイプと値の場合、バグがあるように見えることに注意してくださいがnullの場合、空のフィールドの後、行区切り文字の前に(通常は不要ですが受け入れられる)フィールド区切り文字が必要です。そうしないと、エラーが発生します。

追加:これは一貫して機能しません(ただし、機能する場合もあります!?!?)。安定させるために、ROWterminatorをFIELDterminatorから開始するように変更します。

例えばFIELDTERMINATOR = '#'、ROWTERMINATOR = '#\ n'

それが物事を台無しにしたときにあなたが得るエラーの例の下に:

一括読み込みデータ変換エラー(指定されたコードページのタイプの不一致または無効な文字)、行1、列31(MyDateTimeField)。

(はい、私はすべてASCIIの例で7F文字未満で同じものを取得しました)

例:

最初のバルクは多く失敗します。もう1つは、2つ目と類似しているにもかかわらず、5つ目でのみ失敗しますが、この特殊なケースでは最後に何も許可されません...

テストデータ:

1#2017-06-13 19:00:11.247#0##2017-06-13 19:00:11.247#
2#2017-06-13 19:09:08.817#0##2017-06-13 19:00:11.247#123#
3#2017-06-13 18:44:07.980#1###
4#2017-06-13 09:39:18.367#11## #
5#2017-06-13 09:39:18.370#4###123#

およびSQL

CREATE TABLE TEST_Bulk(
    id int,
    ts1 datetime,
    txt varchar(40) NULL,
    ts2 datetime,
    ts3 datetime,
) 
GO

BULK INSERT TEST_Bulk FROM 'D:\File.txt' WITH (FIRSTROW=1, FIELDTERMINATOR = '#', ROWTERMINATOR = '\n', CODEPAGE= 'ACP' ,TABLOCK)

BULK INSERT TEST_Bulk FROM 'D:\File.txt' WITH (FIRSTROW=1, FIELDTERMINATOR = '#', ROWTERMINATOR = '#\n', CODEPAGE= 'ACP' ,TABLOCK)

select * from TEST_Bulk

drop table TEST_Bulk
1
Eske Rahn