masalibの日記

システム開発、運用と猫の写真ブログです

SQLServerでのSelectして結果をInsertする場合の注意点

概要

AtableというテーブルをSelectした結果を
BtableというテーブルにInsertする仕様です

Btableというテーブルは検索用で使うために
Atableのデータを切り落としてデータをいれる事になりました

無駄に時間がかかってしまった
次回はかからないようにするための
備忘録です

SQL

SET ANSI_WARNINGS OFF;
INSERT INTO [Btable]
SELECT
 '3001' as corner_id
, [article_id] as art_id
, col_id as parent_id
, titledata as title
,SUBSTRING( ( isnull(col1  ,'')   + isnull(col2,'')  + isnull(col3,'') )  ,1, 800) as keyword
, [avail_f] as view_state
, reg_date as view_date 
  FROM [Atable]
WHERE [avail_f] = '1'

SUBSTRING( ( isnull(col1 ,'') + isnull(col2,'') + isnull(col3,'') ) ,1, 800) as keyword
ここがくせもの!!

はまった所1

そこまでハマっていないけど
NULLのカラムがある場合に
NULL + 'A'を結合すると
NULLになってしまう
なので
文字列結合する前にNULLチェックする
それで回避できる
空白とNULLの違いで少しハマった
よく考えればわかるレベルだった

はまった所2

SET ANSI_WARNINGS OFF;

keywordというカラムにデータを
SUBSTRINGで文字数を削っていれているのですが
削っていれる場合にWARNINGが発生する
このWARNINGをOFFにする

一番最初はSQLServerのエクスポート機能で
データ移行していたが、エラーになって進まなかった
エクスポートの機能だとこのエラーになかなか気が付かずハマった

また普通にSelectではでないWarningなので
気が付かずハマった

簡単だと思っていたのに時間がかかった
あう・・・・