インポートする必要のあるファイル(CSV)の日付フィールドは、SQLServerがDD-MMM-YY
としてインポートしている形式ですYY-MM-DD
。したがって01-FEB-13
、としてインポートされ2001-02-13
ます。
SQLが日付のインポートに使用する形式を変更するにはどうすればよいですか?
元のOracleデータベースにアクセスできず、そこからエクスポートされたフラットファイルのみにアクセスできます。したがって、私が行うことはすべてSQLで行う必要があります。
インポートする必要のあるファイル(CSV)の日付フィールドは、SQLServerがDD-MMM-YY
としてインポートしている形式ですYY-MM-DD
。したがって01-FEB-13
、としてインポートされ2001-02-13
ます。
SQLが日付のインポートに使用する形式を変更するにはどうすればよいですか?
元のOracleデータベースにアクセスできず、そこからエクスポートされたフラットファイルのみにアクセスできます。したがって、私が行うことはすべてSQLで行う必要があります。
SQL Serverがデフォルトで使用する日付形式を変更するには、Windowsサーバーのカルチャ設定をいじくり回す必要があります。特にこれがこの問題を抱えている唯一のファイルである場合は、お勧めできません。
スクリプト変換と.NETFrameworkのDateTime.ParseExactメソッドを使用します。これにより、予想される形式を完全に制御できます。まず、CSVファイルの読み取りに使用しているフラットファイル接続マネージャーを構成して、DD-MMM-YY日付の列が、またはではなく、またはその他の日付固有のタイプに設定されるよう
DataType
にします。string
Unicode string
date
database date
データフローで、次のように、ソースコンポーネントと宛先コンポーネントの間にスクリプト変換を配置します。
スクリプト変換への入力として、各DD-MMM-YY日付列を選択します。
そして、各入力列
DataType
に対応するのを使用して出力列を作成します。date
スクリプト変換コードは次のようになります(C#を使用)
using System;
using System.Data;
using System.Globalization; // needed for CultureInfo.InvariantCulture
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void IncomingRows_ProcessInputRow(IncomingRowsBuffer Row)
{
string incomingFormat = "dd-MMM-yy";
Row.ConvertedCreateDate = DateTime.ParseExact(
Row.CreateDate,
incomingFormat,
CultureInfo.InvariantCulture);
Row.ConvertedLastUpdateDate = DateTime.ParseExact(
Row.LastUpdateDate,
incomingFormat,
CultureInfo.InvariantCulture);
}
}
Oracleのto_char()関数を使用して、日付を希望の形式になるようにフォーマットできます。うまくいけば、テキストとして保存することについてのゴードンのコメントは、ステージングテーブルを参照していました。さまざまな理由から、最初のインポートはとにかくステージングテーブルに入れる必要があります。