web-dev-qa-db-ja.com

フラットファイルの日付列の「キャスト仕様の無効な文字値」を修正するにはどうすればよいですか?

各行を区切る{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]を使用して時間コンポーネントを削除しようとしましたが、パイプラインで同じままなので役に立たない

11
manning18

最終的には、フラットファイル接続の列タイプを「データベース日付[DT_DBDATE]」タイプに設定することで解決できました。

どうやら、これらの日付形式の違いは次のとおりです。

DT_DATE年、月、日、および時間で構成される日付構造。

DT_DBDATE年、月、日で構成される日付構造。

DT_DBTIMESTAMP年、月、時間、分、秒、および小数で構成されるタイムスタンプ構造

列タイプをDT​​_DBDATEに変更することで問題は解決しました-データビューアーを添付すると、CYCLE_DATE値は時間コンポーネントなしで単に「12/20/2010」になり、明らかに問題が解決しました。

20
manning18

直面している問題をシミュレートするために、SSIS 2008 R2 with SQL Server 2008 R2バックエンドを使用して次のサンプルを作成しました。この例は、私があなたの質問から集めたものに基づいています。この例は解決策を提供しませんが、問題がどこにあるかを特定するのに役立つ場合があります。

注文番号と注文日という2つの列を持つ簡単なCSVファイルを作成しました。質問で述べたように、両方の列の値は二重引用符( ")で修飾され、行は改行(\ n)で終わります。日付は最後の列です。以下のスクリーンショットは Notepad ++ 、ファイル内の特殊文字を表示できますLFは、改行を示します。

Orders file

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はフラットファイル接続マネージャーです。

Connections

フラットファイル接続マネージャーは、CSVファイルを読み取るように構成されており、設定を以下に示します。赤い矢印は、行われた変更を示します。

フラットファイル接続マネージャーに名前を付けました。 CSVファイルの場所を参照し、ファイルパスを選択しました。テキスト修飾子として二重引用符(")を入力しました。ヘッダー行の区切り文字を{CR} {LF}から{LF}に変更しました。このヘッダー行の区切り文字の変更は、列セクションにも反映されます。

Flat File General

列セクションでは変更は行われていません。

Flat File Columns

列名をColumn0からOrderNumberに変更しました。

Advanced column OrderNumber

列名をColumn1からOrderDateに変更し、データ型もdate [DT_DATE]に変更しました

Advanced column OrderDate

フラットファイル接続マネージャー内のデータのプレビューは適切に見えます。

Data Preview

SSISパッケージのControl Flowタブで、Data Flow Taskを配置しました。

Control Flow

データフロータスク内に、Flat File SourceOLE DB Destinationを配置しました。

Data Flow Task

Flat File Sourceは、FlatFile接続マネージャーを使用してCSVファイルデータを読み取るように構成されました。以下の3つのスクリーンショットは、フラットファイルソースコンポーネントがどのように構成されたかを示しています。

Flat File Source Connection Manager

Flat File Source Columns

Flat File Source Error Output

OLE DB Destinationコンポーネントは、フラットファイルソースからのデータを受け入れ、dbo.Destinationという名前のSQL Serverデータベーステーブルに挿入するように構成されました。以下の3つのスクリーンショットは、OLE DB Destinationコンポーネントがどのように構成されたかを示しています。

OLE DB Destination Connection Manager

OLE DB Destination Mappings

OLE DB Destination Error Output

以下の5つのスクリーンショットに記載されている手順を使用して、フラットファイルソースとOLE DB宛先の間のフローにデータビューアーを追加しました。

Right click

Data Flow Path Editor New

Configure Data Viewer

Data Flow Path Editor Added

Data Viewer visible

パッケージを実行する前に、表にある初期データを確認しました。この投稿の最初に提供されたスクリプトを使用して作成したため、現在は空です。

Empty Table

パッケージを実行し、パッケージの実行を一時停止して、データビューアーでフラットファイルソースからOLE DB Destinationに流れるデータを表示しました。実行を続行するには実行ボタンをクリックしました。

Data Viewer Pause

パッケージは正常に実行されました。

Successful execution

フラットファイルのソースデータがテーブルdbo.Destinationに正常に挿入されました。

Data in table

これがテーブルdbo.Destinationのレイアウトです。ご覧のとおり、フィールドOrderDateはデータ型dateであり、パッケージは引き続きデータを正しく挿入し続けました。

Destination layout

この投稿は解決策ではありませんが。問題がシナリオのどこにあるかを見つけるのに役立ちます。

40
user756519

「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に変更することです。

0
Bogdan Sahlean