1

定期的にレガシー FoxPro データベースからデータをインポートできるように、SSIS パッケージを作成しました。FoxPro データベースのコピーが複数の顧客にインストールされます。全体として、このパッケージは非常にうまく機能しており、私が必要としているすべてのことを達成しています。

ただし、少なくとも 1 人の顧客 (場合によってはそれ以上) が変更された FP データベースを持っており、1 つのテーブルの 1 つの列の長さが増加しているという厄介な状況が 1 つあります。このような顧客でパッケージを実行すると、切り捨てが原因で失敗します。

少し小刻みに余裕を持たせて、長さを 3 から 10 に変更できると思いました。そうすれば、長さ 10 のミュータントと、3 を使用している他のすべての人に対応できます。 t マッチ、ピリオド。

いくつかのオプションがあると思います:

  1. タスクで、「ValidateExternalMetadata」を false に設定します。ただし、それが最も責任のあるオプションかどうかはわかりません... それともそうですか?
  2. 実装チームに依頼して、すべての顧客に対して長さを 10 に変更してもらいます。これは問題になる可能性がありますが、少なくとも彼らの問題になるでしょう。
  3. 列の長さが異なるソリューションで機能するタスクのコピーを作成します。実装はある時点で間違ったパッケージを使用する可能性が高く、すべてのシナリオを処理できない単一のパッケージを提供しなかった理由を誰もが私に尋ね、これを私のせいにします。
  4. あなたが私に記入できるかもしれない他のアプローチを使用してください。
4

2 に答える 2

0

Visual FoxPro OleDB を使用していて、列幅が気になる場合は、呼び出し中に PADR() を使用して明示的に強制できます。これが影響するテーブル/クエリの数はわかりませんが、期待される文字列の長さを保証します。数値、10 進数、日付/時刻、論理 (ブール値) を扱うことが問題にならない場合... とにかく、データを取得するための選択としてこれを行うことができます

select 
      t1.Fld1,
      t1.Fld2,
      padr( t1.CharFld3, 20 ) CharFld3,
      padr( t1.CharFld4, 5 ) CharFld4,
      t1.OtherFld5,
      padr( t1.CharFld6, 35 ) CharFld5
   from
      YourTable t1
   where
      SomeCondition

これにより、文字ベースの (暗黙のサンプル) フィールド "CharFld3"、"CharFld4"、"CharFld6" が、基礎となる構造体の長さに関係なく、それぞれ 20、5、および 35 の幅に強制されます。現在、誰かがあなたの構造よりも長い構造を更新した場合、適切な長さに切り捨てられますが、クラッシュはしません。さらに、列の長さが短い場合は、PADR() 関数を介して指定したフルサイズにパディングされます (右にパディング)。

于 2010-11-17T03:40:03.697 に答える
0

FoxPro側は苦手ですが…

SSIS の期待に応える一時テーブルを作成できます。FoxPro 命令を使用して問題のテーブルから一時テーブルにデータをコピーするタスクを作成します。一時テーブルで動作するようにデータ フローを変更します。

SSIS パッケージによってフロー制御が管理されるように、準備段階 (一時テーブルの作成と一時テーブルへの転送) を SSIS タスクとして作成できます。

于 2010-11-16T19:51:15.633 に答える