SQL Server 2008を使用してコンピューターでdtsxパッケージを作成しました。セミコロンで区切られたcsvファイルから、すべてのフィールドタイプがNVARCHAR MAXであるテーブルにデータをインポートします。
私のコンピューターでは動作しますが、クライアントサーバーで実行する必要があります。同じcsvファイルと宛先テーブルで同じパッケージを作成するたびに、上記のエラーを受け取ります。
パッケージの作成は段階的に行っており、すべてが問題ないようです。マッピングはすべて正しいですが、最後のステップでパッケージを実行すると、このエラーを受け取ります。彼らはSQL Server 2005を使用しています。
誰でもこの問題を探す場所をアドバイスできますか?
非ユニコードソースからユニコードSQL Serverテーブルへの変換の問題は、次の方法で解決できます。
ある時点で、nvarchar
列をvarchar
列に変換しようとしています(またはその逆)。
さらに、なぜすべてが(おそらく)nvarchar(max)
なのでしょうか?私が見たことがあれば、それはコードの匂いです。 SQL Serverがこれらの列を保存する方法を知っていますか?これらは、8kページに収まらないため、実際の行から列が格納される場所へのポインターを使用します。
非Unicode文字列データ型:
テキストファイルにはSTRを使用し、SQL Server列にはVARCHARを使用します。
nicode文字列データ型:
テキストファイルにはW_STRを使用し、SQL Server列にはNVARCHARを使用します。
問題は、データ型が一致しないため、変換中にデータが失われる可能性があることです。
2つのソリューション:1-ターゲット列のタイプが[nvarchar]の場合、[varchar]に変更する必要があります
2-「派生列」コンポーネントをSSISパッケージに追加し、次の式で新しい列を追加します。
(DT_WSTR、"length")[ColumnName]
長さはターゲット表の列の長さで、ColumnNameはターゲット表の列の名前です。最後に、マッピング部分では、元の列ではなく、この新しく追加された列を使用する必要があります。
これがSSISのベストプラクティスであるかどうかはわかりませんが、この種のアクティビティを実行する場合、ツールが少し不格好だと感じることがあります。
コンポーネントを使用する代わりに、クエリ内のデータを変換できます
する代わりに
SELECT myField = myNvarchar20Field
FROM myTable
できる
SELECT myField = CONVERT(VARCHAR(20),myNvarchar20Field)
FROM myTable
マイク、私はSQL Server 2005のSSISで同じ問題を抱えていました...どうやら、DataFlowDestinationオブジェクトは常に、入力されるデータをUnicodeに検証しようとします。そのオブジェクト、詳細エディター、コンポーネントプロパティペインに移動し、「ValidateExternalMetaData」プロパティをFalseに変更します。次に、[入力および出力プロパティ]ペインの[宛先の入力]、[外部列]に移動し、各列のデータ型と長さを、目的のデータベーステーブルに一致するように設定します。これで、そのエディターを閉じると、それらの列の変更は保存され、検証されずに機能します。
以下の手順に従って、このエラーを回避してください(ユニコードと非ユニコードの文字列データ型の間で変換できません)。
i)データ変換変換ツールをDataFlowに追加します。
ii)データフロー変換を開き、[string DT_STR]データタイプを選択します。
iii)次に、宛先フローに移動し、マッピングを選択します。
iv)i/p名を名前のコピーに変更します。
50個以上の列がある場合、dtsデータ変換タスクには時間がかかります!この修正は以下のリンクで見つかりました
http://rdc.codeplex.com/releases/view/48420
ただし、2008年以降のバージョンでは機能しないようです。このため、この問題を回避する必要があります。
*Open the .DTSX file on Notepad++. Choose language as XML
*Goto the <DTS:FlatFileColumns> tag. Select all items within this tag
*Find the string **DTS:DataType="129"** replace with **DTS:DataType="130"**
*Save the .DTSX file.
*Open the project again on Visual Studio BIDS
*Double Click on the Source Task . You would get the message
the metadata of the following output columns does not match the metadata of the external columns with which the output columns are associated:
...
Do you want to replace the metadata of the output columns with the metadata of the external columns?
*Now Click Yes. We are done !
レジストリにアクセスしてクライアントを構成し、LANGを変更します。 Oracleの場合、HLM\SOFTWARE\Oracle\KEY_ORACLIENT ... HOME\NLS_LANGに移動し、適切な言語に変更します。
これがまだ問題かどうかわかりませんが、私はこの簡単な解決策を見つけました:
これが明確でわかりやすいことを願っています
解決済み-元の質問に:
これは前に見たことがあります。最も簡単な修正方法(すべてのメタデータはソース接続から利用できるため、これらのデータ変換手順をすべて必要としないでください):
OLE DBソースとOLE DB宛先を削除する遅延検証がFALSEであることを確認します(後でTrueに設定できます)クエリでOLE DBソースを再作成しますなど。すべての出力データ列タイプが正しいことをアドバンスドエディターで確認します。OLE DB宛先を再作成し、マップし、新しいテーブルを作成(または既存に再マップ)すると、SSISがすべて取得したことがわかります。データ型が正しい(ソースと同じ)。
上記のものが非常に簡単です。
ソースクエリ/ビュー/プロシージャのフィールドとして静的文字を選択し、ユニコードの宛先フィールドデータ型を選択すると、このエラーが発生する場合があります。
以下が直面した問題です:ソースで以下のスクリプトを使用しました
エラーメッセージColumn "CATEGORY" cannot convert between Unicode and non-Unicode string data types.
を次のように取得しました。 エラーメッセージ
解決策:複数のオプションを試しましたが、うまくいきませんでした。次に、以下のように、Unicodeで作成するために静的値にNを接頭辞として付けました。
SELECT N'STUDENT DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM STUDENTS
UNION
SELECT N'FACULTY DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM FACULTY
まだこの問題が発生している場合は、Oracle Clientのバージョンの違いに関連していることがわかりました。
完全な経験とソリューションをここに投稿しました: https://stackoverflow.com/a/43806765/923177