SQL Server 2012 BCP ユーティリティ 使用時の警告 “フォーマット ファイルを使用して BCP インポートを行うと、区切り列内の空の文字列が NULL に変換されます。” について

 

 

皆さん、こんにちは。 SQL Server/Windows Azure SQL Database サポート チームです。

今回は、SQL Server 2012 に関するお問い合わせの中で、よくあるお問い合わせの一つを紹介したいと思います。

 

[質問]

SQL Server 2012 の BCP ユーティリティ を使用し、テーブル上のデータをエクスポートした場合、 以下の警告が毎回 発生する。

フォーマット ファイルを使用して BCP インポートを行うと、区切り列内の空の文字列が NULL に変換されます。

コマンドプロンプト から BCP ユーティリティ で テーブル上のデータをエクスポートする際、 –o オプション や –e オプション を使用し、エラーや警告の発生有無により、処理が正常に完了しているかを判断しているが、毎回 警告が発生するため、処理の正常有無を判断することができない状態となっている。

この警告を出さないようにする方法があるか?

[回答]

この警告を出力させないようにする方法はありません。

SQL Server 2012 BCP ユーティリティでは、テーブル列に NULL 値を含む テーブルをエクスポートした場合、この警告が出力されるようになりました。

そのため、SQL Server 2012 BCP ユーティリティ で テーブル列に NULL 値を含む テーブルをエクスポートした場合は、この警告が出力されることになります。

 

なお、バッチファイルから BCP ユーティリティを実行後、エラーや警告の何れかがログに出力されたことを検知し、処理が正常に完了していないと判断している場合は、BCP の処理自体は正常に完了していたとしても、SQL Server 2012 BCP ユーティリティでは警告が発生する場合があることに起因し、処理が正常に完了していないと判断されてしまうことが予測されます。

そこで、SQL Server 2012 BCP ユーティリティを使用する場合、少し複雑にはなりますが、以下に記載しましたバッチ例のようにエラー判定を実施することにより、今回の警告のみが出力されている場合は、BCPの処理は正常に完了していると判断することが可能となります。

 

---

ECHO OFF

SET iErrorCnt=0
SET iWarnCnt=0

: BCP 処理を記載 :
BCP.exe BCP.dbo.tab1 out e:\temp\tab1.dat -T -t, -w -oE:\temp\bcp_tab1.log

: %ERRORLEVEL% が 0 以外であればエラーと判断 :
IF NOT %ERRORLEVEL% == 0 GOTO ERR_MSG

: BCP 処理で出力されたログの中から "SQLState" を検索し、ヒットした件数を保持
FOR /f %%a IN ('findstr "SQLState" E:\temp\bcp_tab1.log’) DO SET /a iErrorCnt=iErrorCnt+1

: BCP 処理で出力されたログの中から "警告" を検索し、ヒットした件数を保持
FOR /f %%b IN ('findstr "警告" E:\temp\bcp_tab1.log') DO SET /a iWarnCnt=iWarnCnt+1

: エラー判定処理 :
IF %iErrorCnt% GTR 0 IF %iWarnCnt% == 0 GOTO ERR_MSG
IF %iErrorCnt% GTR 1 GOTO ERR_MSG

: 正常時の処理を記載 :
echo "SUCCESS"

Exit

 

:ERR_MSG

: エラー時の処理を記載 :
echo "Error"

---

[参考情報]

bcp ユーティリティ

※ 本Blogの内容は、 2013年8月 現在の内容となっております。