SQL : 文字列データまたはバイナリ データが切り捨てられます。
SQL Serverで文字列カラムの長さ定義以上の文字列をINSERTしようとすると出るエラー
処理は途中で止まる
設定で変更できる
INSERTでカラム長より大きい文字列を挿入する時、文字が切れてもいいからとにかくINSERTを正常終了してほしい
以下のような状況で、該当データを特定するにはどうすればよいか?
状況
テーブルAからテーブルBへ大量にデータをinsertしたい。sqlとしては以下のようなイメージ
code:sql
insert into テーブルB (列1, 列2, 列3, /* いっぱいあるので略 */ 列200)
select 列1, 列2, 列3, /* いっぱいあるので略 */ 列200 from テーブルA;
テーブルAにはデータがいっぱい入っている
実行すると「文字列データまたはバイナリ データが切り捨てられます」といわれる
以下のように順番にすすめていけば、突き止めることはできる
1. テーブル定義から列xの長さを見ていってテーブルA.列x.length > テーブルB.列x.lengthとなっている列がまずあやしい
2. その列をコメントアウトしてみる。今回は列2がテーブルAだとvarchar(200)でテーブルBだとvarchar(100)だったのであやしいと判断しコメントアウトしてみる
code:sql
insert into テーブルB (列1, /*列2*/, 列3, /* いっぱいあるので略 */ 列200)
select 列1, /*列2*/, 列3, /* いっぱいあるので略 */ 列200 from テーブルA;
insert成功した→列2から該当するレコードを突き止める
insert失敗した→他の列もあやしいので、1.に戻る
3. 列を突き止めたので、len(列2), lenb(列2)などで長さを見てみる
code:sql
select len(列2) as len, 列2 from テーブルA order by 1 desc;
varchar(100)に格納しきれないデータが見つかった
table:result
len 列2
190 長いデータです......................(以下略)
80 短いデータです(以下略)
... ...
4. 結果によって、文字列の方をなんとかするか(途中で切ってもよいか?など)、テーブル定義をなんとかするか(長さ増やすなど)を決める
「これ」使えば該当レコード一発でわかりますよ!みたいな方法が知りたい
関連
文字列データまたはバイナリ データが切り捨てられます。ステートメントは終了されました。