列に空の文字列が含まれているときにbcpがnullを出力し、列がnullのときに空の文字列を出力するのはなぜですか?
-
10-07-2019 - |
質問
これは本当に奇妙な振る舞いとして私を驚かせ、これを見つける前にコードのバグをチェックするのにしばらく費やしました
データベーステーブルまたはビューからファイルへの" outコピー。既存のファイルを指定すると、ファイルは上書きされます。データを抽出するとき、bcpユーティリティは空の文字列をnullとして、null文字列を空の文字列として表すことに注意してください。 ( http://msdn.microsoft.com/en-us/library/ms162802から.aspx )
明らかに、これで問題を解決できましたが、これが事実である理由を誰かが考えたり、知っている人はいますか?
解決
しばらく経ちましたが、SQL Server 6.5への後方互換性/レガシーであると確信しています
SQL Server 6.5は空の文字列を保存できませんでした。常に1つのスペースがありました。これはSQL 7で変更されました
だから ''-> NULL
および ''-> ''
は古代史の観点から正しいです。
他のヒント
SELECT ARTICULO as Articulo,
case when rtrim(CCOLOR) = '' then null else rtrim(CCOLOR) end as Color,
case when rtrim(TALLE) = '' then null else rtrim(TALLE) end as Talle,
from precios
空の代わりに null
を送信します。
ここで最適なソリューションを見つけます:
https:// bytes .com / topic / sql-server / answers / 143738-bcp-inserting-blank-space-empty-string
SQLクエリでケース構造を使用して回避策を見つけました 空の文字列をnullに変更します。 BCPは結果を出力します 空としてnull! ご協力ありがとうございます。 エリック
これは、「デフォルト値」に関連しています。 BCPのセクション:
たとえば、データファイルにnullフィールドがある場合、代わりに列のデフォルト値がロードされます。
他の奇妙なシステムからプレーンテキストファイルをインポートする時代を思い出す必要があります。 BCPは、 ''
を" not defined"(=データなし)として変換し、データベースにNULL(=データなし)を設定します。データベースからのNULLを回避する他の方法は、他のシステムの ''
でなければなりません。
データベースから「実際の」データを取得するには、 -k
スイッチを使用します。
次の修飾子は、テーブル列のデフォルト値(ある場合)を継承するのではなく、バルクインポート操作中にデータファイルの空のフィールドがnull値を保持することを指定します。
次に、ファイル/データベースにASCII 0x0があります。