0

次のフローを含むSSISパッケージがあります。パッケージには2つのデータフロータスクがあります。

データフロータスク1:

最初のデータフロータスクでは、異なるデータベース内の複数のテーブルを含むストアドプロシージャからの出力が、データベース内の2つのテーブルに書き込まれます。

データフロータスク2:

2番目のデータフロータスクでは、上記のテーブルの1つからの出力がフラットファイルに書き込まれます。

パッケージに含まれるすべてのテーブルには、BirthDateデータ型の列名がありますVARCHAR(10)。この列には、YYYYMMDD形式の文字列として日付値が含まれます。

フラットファイルに書き込まれたデータは、の形式で保存されていますYYYY-MM-DD。ただし、日付の値をフラットファイルに次の形式で書き込む必要がありますMM-DD-YYYY

質問:

  1. MM-DD-YYYYフラットファイル内で日付形式を実現するにはどうすればよいですか?

  2. 列のデータ型をVARCHAR(10)からテーブル内の他のデータ型に変更する必要がありますか?さまざまなデータベースにたくさんのテーブルがあります。

4

4 に答える 4

1

.NET Framework には非常に優れた文字列操作機能がいくつかあり、スクリプト変換を使用すると、この問題を簡単に処理できます。スクリプト変換コンポーネントをデータフローに追加します。スクリプト変換エディターの [入力列] セクションで、BirthDate[使用可能な入力列] グリッドに含まれていることを確認し、その UsageType を に設定しReadWriteます。次に、この少しの C# コードは、YYYYMMDD 文字列を MM-DD-YYYY に変換します。

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    DateTime birthDate = DateTime.ParseExact(
        Row.BirthDate, 
        "yyyyMMdd",
        System.Globalization.CultureInfo.InvariantCulture);
    Row.BirthDate = birthDate.ToString("MM-dd-yyyy");
}

2 番目の質問に関して: 理想的には、データベースに日付を格納する場合は、適切なデータ型を使用する必要があります。BirthDate 列がすべて次のように定義された理由を組織全体に尋ねてみてくださいVARCHAR。その時点で十分な理由があった可能性があります。

于 2013-02-22T18:36:02.000 に答える
1

同様の状況でデータ変換ツールを使用します。ソース テーブルのデータ型を変更する必要はありません。ソース テーブルと宛先テーブルの整合性を維持するのに役立ちます。

ここに画像の説明を入力

幸運を祈ります

于 2013-02-22T03:35:32.873 に答える
0

常に、つまり 20130221YYYYMMDDのようにゼロで埋められている場合は、単純な文字列関数を使用します。

SUBSTRING([Birthdate],5,2) + '-' 
+ SUBSTRING([Birthdate],7,2) + '-' 
+ SUBSTRING([Birthdate],1,4)

datetime実際のまたはdateデータ型を使用する方が良いことに同意します。しかし、できない場合やしない場合は、このような単純な表現が最も簡単な方法のように思えます。

于 2013-02-22T02:39:52.863 に答える
0

これが1つの解決策です。最適には、列を正しいデータ型に変更する必要があります。

SELECT CONVERT(VARCHAR, CONVERT(DATETIME, wrongtypecol, 120), 110) AS date 
FROM   tbl 

デモを見る

于 2013-02-22T02:40:03.157 に答える