外部データソース(Excelなど)から新規レコードのみをテーブルに追加したい時などにLookupアイテムを使って既存レコードの存在を調べる訳ですが、既存レコードの比較対照フィールドがSmallDateTimeの場合はヒットしない。
既存レコードの検査方法は以下のリンクから。
SQL SSIS, insert only new rows.
検証方法としては、
1.SmallDateTimeフィールドを使っている新規テーブルを作成。物理主キーをGUIDなどにしておく。というのも、論理主キーを物理主キーとしてしまうと、以下の8を重複キーエラーで失敗するため。
2.Excelで日時データを使ったサンプルデータを作る。
3.Control Flow に Data Flow を追加
4.Excel Source と OLE DB Destination を Data Flow に追加。
5.上記2つの間に Lookup Data Flow Transformation を挟み込む。
6.Lookup の Reference Table を OLE DB Destination の Table と合わせておく。勿論、論理主キーのマッピングも同時に行う。
7.初回Runでは参照テーブルがEmptyなので全件テーブルに追加される。問題無し。
8.2回目以降はLookupが効きエラーを吐き出すはずが、スルーされて再度全件テーブルに追加される。これが問題。
まとめ
テーブルデザインの時点で、SmallDateTimeタイプを使わないようにしておく。DateTimeが4バイトでSmallDateTimeは2バイト。無理してSmallDateTimeを使う必要も無しかと。
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment