1. ホーム
  2. sql-server

[解決済み] BCP - IDENTITY列を持つテーブルにインポートする際、キャスト指定に無効な文字値がある。

2022-03-04 04:07:31

質問

UNIXからSQL Serverへファイルをロードしようとしています。BCPを実行すると以下のエラーが発生しますが、データ型をCharに変更すると同じファイルをロードすることができました。

使用したコマンド

-- bcp [SQLAAA].[APP_XXX].[ACTIVITY_V1] in /home/XXX_ACTIVITY.txt -c -S xddb001 -e /home/ERRORS.log -t "|" -r "\n" -U test12 -P test12

ソースファイルです。

222|2017-12-27|Y|ABC|2017-12-27|ABC|2017-12-27
255|2018-01-04|N|ABC|2018-01-04|ABC|2018-01-04

エラーメッセージを表示します。

<ブロッククオート

1行目7列目:キャスト指定@の文字値が無効です。

定義表です。

CREATE TABLE [APP_XX].[ACTIVITY]
(
[C1] [varchar](10) NOT NULL,
[C2_DATE] [date] NOT NULL,
[c3] [varchar](1) NULL,
[C4_NM] [varchar](10) NULL,
[C5_DTM] [date] NULL,
[C6_NM] [varchar](10) NULL,
[C7_DTM] [date] NULL,
[ROW_ID] [bigint] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]

どのような修正が可能か教えていただけませんか?

解決方法は?

IDENTITY 列を持つテーブルにインポートするとき、インポートファイルで IDENTITY 列の値を提供しない場合、インポートで IDENTITY 列をスキップすることをフォーマットファイルで指定する必要があります。

この作業方法については、明示的に マイクロソフトのBCPに関するドキュメント、フラグ -E :

<ブロッククオート

データファイルにテーブルまたはビューの ID 列の値が含まれていない場合、フォーマットファイルを使用して、データをインポートするときにテーブルまたはビューの ID 列をスキップするように指定します; SQL Server は自動的にその列に固有の値を割り当てます。

必要なこと

  1. 最初 BCPでフォーマットファイルを作成する . 例えば、非XMLフォーマットファイルの場合、コマンドは次のようになります。 BCP table_or_view format nul -f format_file_name
  2. フォーマットファイルのIDENTITY列をスキップするように指定します。
  3. で作成したフォーマットファイルを使用します。 BCP IN コマンドを使用して BCP -f フラグ