私は SSIS 2016 を使用していくつかのデータ フローを作成してきました。私の目標の 1 つは、切り捨ての問題を把握し、切り捨てが発生している場所を強調表示するエラー テーブルを作成できるようにすることです。これの一部は、JSON データをインポートしているためであり、一部のフィールドには、データベースに既に設定されているものよりも長いデータが含まれている可能性があります。
背景を説明するために、簡略化したフローは次のとおりです。
- JSON をテーブルに一括挿入する
- JSON パスをビュー構造に抽出する上にランディング ビューを作成する
- ビュー データを運用テーブルに流すデータ フローを作成する
- 着陸から本番までの間に発生した切り捨てを強調表示します
SQL Server が JSON を処理する方法のため、フィールドの長さは MAX です。ビューを作成するときに、CROSS APPLY でフィールドの長さを設定します。例として、本番テーブルで RECIPIENT_NAME を VARCHAR(10) に設定します。ただし、RECIPIENT_NAME の場合JSON ファイルで長さが 15 の行があった場合、このビューを作成するときに、15 が 10 に切り捨てられたことを認識できませんでした。これを回避するために、ランディング ビューのクロスで RECIPIENT_NAME の長さを 11 に設定します。行がランディングから本番環境に移動すると、RECIPIENT_NAME は 11 から 10 になり、この時点で実際に切り捨てがあった場合、SSIS はそれを強調表示し、赤いエラー パスの下の行をキャプチャできます。
SSIS には、ランディング ビューを指す OLEDB Source と、プロダクション テーブルを指す OLEDB Destination があります。また、切り捨て時に行をリダイレクトするように各列が設定されているエラー テーブルへのソースからのエラー フローもあります。
この時点で、宛先タスクの検証時に切り捨てが発生する可能性があることを SSIS が警告し、宛先タスクに黄色の三角形が表示されます。
[PRD_SYSTEM [189]] 警告: 長さ 11 のデータ フロー列 "RECIPIENT_NAME" から長さ 10 のデータベース列 "RECIPIENT_NAME" にデータを挿入すると、切り捨てが発生する可能性があります。
これをいくつかのサンプル データでテストするとき、RECIPIENT_NAME の JSON フィールドに意図的に 20 文字の行を入れました。これは、切り捨ての問題としてフラグが立てられることはなく、切り捨てられますが、本番テーブルへのデータの入力に進みます。
ただし、ソースを右クリックし、[高度なエディターを表示] > [入力および出力プロパティ] > [OLEDB ソース出力] を選択して [出力列] を展開し、RECIPIENT_NAME 列 (最初は 11) の [データ型プロパティ] の下にある [長さ] を本来あるべき値に変更します。本番テーブルに 10 を入力してプロセスを再実行すると、行は実際にエラー テーブルにリダイレクトされます。
興味深いことに、警告が変更され、代わりにソース タスクに黄色の三角形が表示されます。
[LND_VW_SYSTEM [81]] 警告: 長さ 11 のデータベース列 "RECIPIENT_NAME" から長さ 10 のデータ フロー列 "RECIPIENT_NAME" にデータを取得すると、切り捨てが発生する可能性があります。
今、私の理解では、SSIS は設定したとおりに切り捨てをキャプチャする必要があり、高度なエディターで個々の列を編集する必要はありません。