2016-06-20 41 views
0

datetime-columnの巨大なcsvファイルをYYYY.MM.DD hh:mm:ss.nnn(2015.09.28 00:00:02.721)の形式でインポートしたいとします。これは、datetime: datetime (Transact-SQL)のサポートされている文字列リテラル形式です。 私はIntegration Servicesのデータ型としてDT_DBTIMESTAMPを使用しています: Integration Services Data Types。 しかし、変換エラーのためにインポートが機能しません。私はフォーマットYYYY-MM-DD hh:mm:ss.nnnでしかインポートできません。私のOS、SQL 2014、DBはすべてドイツ語です。検索せずにこのタスクを実行し、csvを正規表現に置き換えるにはどうすればよいですか?SSISの日時変換エラー

答えて

0

私は私はあなたが正規表現について何を意味するか理解していない - しかし、ここであなたのためのソリューションです:

あなたは一時的な保持テーブルにファイルをインポートしてからDataConversionを使用してdatetime型に変換することができます仕事。

はまた、あなたのテーブルに次のSQLを適用することができます - おそらく速くなるだろう:

OldDateColが「無効」の日付形式を含むインポートされたテキストフィールドです
UPDATE tempTable SET NewDateCol = CAST(OldDateCol AS DATETIME) 

私たちは、これが動作することを知っているので:

SELECT CAST('2012.05.06 11:25:33.123' AS DATETIME) 
+0

ポイントはミリ秒単位の区切り文字であり、私は高速置換えを使用することができないので、検索と置換で通常のエクスプレッションを使用する必要があります。 FART(http://fart-it.sourceforge.net/)。私たちは、ここでは巨大なcsvファイル(100M行以上)について話していますが、適切な型変換を達成するためにソースファイルまたはSQLで余分な変換ステップが必要であるとは思えません。 –

+1

PS Thanlあなたのご提案は大変ありがとうございます。CASTは正常に動作します。しかし、私は余分なステップ、BULK INSERTとフォーマットファイルとpehpapsなしでソリューションを検索 - それは動作するのだろうか? –

+0

フラットファイル接続内の入力列をインポートする際に、DT_DBTIMESTAMP2に設定する必要がある場合、「余分な」ステップが必要ないとは思わない。 – BIDeveloper

0

ピュアSSISのデータフローソリューション - NewDateCol

(DT_DBTIMESTAMP2)(REPLACE(SUBSTRING(OldDateCol,1,10),".","-")+SUBSTRING(OldDateCol, 11, LEN(OldDateCol))) 

については、以下の式で派生列変換は、基本的には、この式は置き換えられます。最初の10個のシンボルに - をつけて残りを追加します。

+0

なぜ交換する必要がありますか? – BIDeveloper

+0

@BIDeveloper SSIS Datetimeにキャストする文字列は、YYYY-HH-MM hh:mm:ss.nnnの形式で指定する必要があります。したがって、型キャストの前にダッシュを入れてください。 – Ferdipux

+0

これを試してください:SELECT CAST( '2012.05.06 11:25:33.123' AS DATETIME) ...いいえ** REPLACE **が必要です。 – BIDeveloper

0

私の対処方法: 1. CREATE TABLE with datetime(何らかの理由で2015.09.28 00:00:01.159が2015-09-28 00:00:01.160などのミリ秒単位の丸め誤差を発生させる)またはdatetime2( 3)(2015.09.28 00:00:01.159は2015-09-28 00:00:01.1590000 - 正確で大型です) 2. SET DATEFORMAT ymd 3. csvからTABLOCKとCODEPAGE = 'RAW'を使用してBULK INSERTを増やしてくださいperfomance