各行を区切る{LF}と日付形式が"12/20/2010"
(引用符を含む)である日付列を持つCSVファイルがあります
宛先列は、(datetimeではなく)date型のSQL Server 2008データベーステーブルです
フラットファイル接続マネージャーで、日付列をデータ型date [DT_DATE]
に設定し、TextQualifiedをtrueに設定し、列区切り文字を{LF}
に設定しました=(各行の最後の列です)。テキスト修飾子を"
に設定しています
これをOLE宛先にロードしようとすると、次のエラーが表示されます
[TRN_DORPS [760]]エラー:SSISエラーコードDTS_E_OLEDBERROR。 OLE DBエラーが発生しました。エラーコード:0x80004005。 OLE DBレコードが利用可能です。ソース:「Microsoft OLE SQL Server用DBプロバイダー」Hresult:0x80004005説明:「キャスト仕様の文字値が無効です。」。 [TRN_DORPS [760]]エラー:入力 "OLE DB Destination Input"(773)の入力列 "" CYCLE_DATE ""(874)にエラーがありました。返された列のステータスは、「データが失われる可能性があるため、値を変換できませんでした。」です。
データビューアをアタッチすると、パイプラインの値は2010-12-20 00:00:00.0000000
になります-今回はコンポーネントが問題の原因ですか? (DT_DATE)(DT_DBDATE)[CYCLE_DATE]
を使用して時間コンポーネントを削除しようとしましたが、パイプラインで同じままなので役に立たない
最終的には、フラットファイル接続の列タイプを「データベース日付[DT_DBDATE]」タイプに設定することで解決できました。
どうやら、これらの日付形式の違いは次のとおりです。
DT_DATE年、月、日、および時間で構成される日付構造。
DT_DBDATE年、月、日で構成される日付構造。
DT_DBTIMESTAMP年、月、時間、分、秒、および小数で構成されるタイムスタンプ構造
列タイプをDT_DBDATEに変更することで問題は解決しました-データビューアーを添付すると、CYCLE_DATE値は時間コンポーネントなしで単に「12/20/2010」になり、明らかに問題が解決しました。
直面している問題をシミュレートするために、SSIS 2008 R2
with SQL Server 2008 R2
バックエンドを使用して次のサンプルを作成しました。この例は、私があなたの質問から集めたものに基づいています。この例は解決策を提供しませんが、問題がどこにあるかを特定するのに役立つ場合があります。
注文番号と注文日という2つの列を持つ簡単なCSVファイルを作成しました。質問で述べたように、両方の列の値は二重引用符( ")で修飾され、行は改行(\ n)で終わります。日付は最後の列です。以下のスクリーンショットは Notepad ++ 、ファイル内の特殊文字を表示できますLFは、改行を示します。
SQL Serverデータベースにdbo.Destination
という名前の単純なテーブルを作成して、SSISパッケージを使用してCSVファイルデータを作成しました。テーブルの作成スクリプトを以下に示します。
CREATE TABLE [dbo].[Destination](
[OrderNumber] [varchar](50) NULL,
[OrderDate] [date] NULL
) ON [PRIMARY]
GO
SSISパッケージで、2つの接続マネージャーを作成しました。 SQLServerは、OLE SQL Serverデータベースに接続するためのDB接続を使用して作成されました。FlatFileはフラットファイル接続マネージャーです。
フラットファイル接続マネージャーは、CSVファイルを読み取るように構成されており、設定を以下に示します。赤い矢印は、行われた変更を示します。
フラットファイル接続マネージャーに名前を付けました。 CSVファイルの場所を参照し、ファイルパスを選択しました。テキスト修飾子として二重引用符("
)を入力しました。ヘッダー行の区切り文字を{CR} {LF}から{LF}
に変更しました。このヘッダー行の区切り文字の変更は、列セクションにも反映されます。
列セクションでは変更は行われていません。
列名をColumn0からOrderNumber
に変更しました。
列名をColumn1からOrderDate
に変更し、データ型もdate [DT_DATE]
に変更しました
フラットファイル接続マネージャー内のデータのプレビューは適切に見えます。
SSISパッケージのControl Flow
タブで、Data Flow Task
を配置しました。
データフロータスク内に、Flat File Source
とOLE DB Destination
を配置しました。
Flat File Source
は、FlatFile接続マネージャーを使用してCSVファイルデータを読み取るように構成されました。以下の3つのスクリーンショットは、フラットファイルソースコンポーネントがどのように構成されたかを示しています。
OLE DB Destination
コンポーネントは、フラットファイルソースからのデータを受け入れ、dbo.Destination
という名前のSQL Serverデータベーステーブルに挿入するように構成されました。以下の3つのスクリーンショットは、OLE DB Destinationコンポーネントがどのように構成されたかを示しています。
以下の5つのスクリーンショットに記載されている手順を使用して、フラットファイルソースとOLE DB宛先の間のフローにデータビューアーを追加しました。
パッケージを実行する前に、表にある初期データを確認しました。この投稿の最初に提供されたスクリプトを使用して作成したため、現在は空です。
パッケージを実行し、パッケージの実行を一時停止して、データビューアーでフラットファイルソースからOLE DB Destinationに流れるデータを表示しました。実行を続行するには実行ボタンをクリックしました。
パッケージは正常に実行されました。
フラットファイルのソースデータがテーブルdbo.Destination
に正常に挿入されました。
これがテーブルdbo.Destinationのレイアウトです。ご覧のとおり、フィールドOrderDateはデータ型dateであり、パッケージは引き続きデータを正しく挿入し続けました。
この投稿は解決策ではありませんが。問題がシナリオのどこにあるかを見つけるのに役立ちます。
「2010-12-20 00:00:00.0000000」値の適切なデータ型は DATETIME2(7) /DT_DBTIME2()です。
ただし、CYCLE_DATEフィールドに使用されるデータ型はDATETIME- DT_DATE です。これは、ミリ秒単位の精度を意味し、精度は3ミリ秒ごと(yyyy-mm-ddThh:mi:ss.mmL(Lは0、3、または7))です。
解決策は、CYCLE_DATE日付タイプをDATETIME2-DT_DBTIME2に変更することです。