web-dev-qa-db-ja.com

インポートパッケージエラー-Unicodeと非Unicode文字列データ型の間で変換できません

SQL Server 2008を使用してコンピューターでdtsxパッケージを作成しました。セミコロンで区切られたcsvファイルから、すべてのフィールドタイプがNVARCHAR MAXであるテーブルにデータをインポートします。

私のコンピューターでは動作しますが、クライアントサーバーで実行する必要があります。同じcsvファイルと宛先テーブルで同じパッケージを作成するたびに、上記のエラーを受け取ります。

パッケージの作成は段階的に行っており、すべてが問題ないようです。マッピングはすべて正しいですが、最後のステップでパッケージを実行すると、このエラーを受け取ります。彼らはSQL Server 2005を使用しています。

誰でもこの問題を探す場所をアドバイスできますか?

64
Mike Thomas

非ユニコードソースからユニコードSQL Serverテーブルへの変換の問題は、次の方法で解決できます。

  • データフローにデータ変換変換ステップを追加する
  • データ変換を開き、適用する各データタイプに対してUnicodeを選択します
  • 該当する各列の出力エイリアスに注意してください(デフォルトでは[元の列名]のコピーという名前です)
  • 次に、「宛先」ステップで、「マッピング」をクリックします
  • すべての入力マッピングを変更して、前のステップのエイリアス列から取得します(これは簡単に見落とされてしまい、なぜ同じエラーが引き続き発生するのか疑問に思うステップです)
107
vanlandingham

ある時点で、nvarchar列をvarchar列に変換しようとしています(またはその逆)。

さらに、なぜすべてが(おそらく)nvarchar(max)なのでしょうか?私が見たことがあれば、それはコードの匂いです。 SQL Serverがこれらの列を保存する方法を知っていますか?これらは、8kページに収まらないため、実際の行から列が格納される場所へのポインターを使用します。

14
Eric

非Unicode文字列データ型:
テキストファイルにはSTRを使用し、SQL Server列にはVARCHARを使用します。

nicode文字列データ型:
テキストファイルにはW_STRを使用し、SQL Server列にはNVARCHARを使用します。

問題は、データ型が一致しないため、変換中にデータが失われる可能性があることです。

8
Even Mien

2つのソリューション:1-ターゲット列のタイプが[nvarchar]の場合、[varchar]に変更する必要があります

2-「派生列」コンポーネントをSSISパッケージに追加し、次の式で新しい列を追加します。
(DT_WSTR、"length")[ColumnName]

長さはターゲット表の列の長さで、ColumnNameはターゲット表の列の名前です。最後に、マッピング部分では、元の列ではなく、この新しく追加された列を使用する必要があります。

8
Hassan

これがSSISのベストプラクティスであるかどうかはわかりませんが、この種のアクティビティを実行する場合、ツールが少し不格好だと感じることがあります。

コンポーネントを使用する代わりに、クエリ内のデータを変換できます

する代わりに

SELECT myField = myNvarchar20Field
FROM myTable

できる

SELECT myField = CONVERT(VARCHAR(20),myNvarchar20Field)
FROM myTable
7
Chris Rodriguez

これは、IDEを使用して修正するソリューションです。

  1. 以下に示すように、Data Conversionアイテムをデータフローに追加します。

enter image description here

  1. Data Conversionアイテムをダブルクリックし、次のように設定します。

enter image description here

  1. DB Destinationアイテムをダブルクリックし、Mappingをクリックして、input Columnが実際に来るものと同じであることを確認します[あなたの列名]のコピーから。これは実際にはData Conversion出力ではなくDB Source出力です(ここでは注意してください)。これがスクリーンショットです:

enter image description here

そしてそれはそれです..保存して実行します..

5
t_plusplus

マイク、私はSQL Server 2005のSSISで同じ問題を抱えていました...どうやら、DataFlowDestinationオブジェクトは常に、入力されるデータをUnicodeに検証しようとします。そのオブジェクト、詳細エディター、コンポーネントプロパティペインに移動し、「ValidateExternalMetaData」プロパティをFalseに変更します。次に、[入力および出力プロパティ]ペインの[宛先の入力]、[外部列]に移動し、各列のデータ型と長さを、目的のデータベーステーブルに一致するように設定します。これで、そのエディターを閉じると、それらの列の変更は保存され、検証されずに機能します。

4
Brinky

以下の手順に従って、このエラーを回避してください(ユニコードと非ユニコードの文字列データ型の間で変換できません)。

i)データ変換変換ツールをDataFlowに追加します。
ii)データフロー変換を開き、[string DT_STR]データタイプを選択します。
iii)次に、宛先フローに移動し、マッピングを選択します。
iv)i/p名を名前のコピーに変更します。

4
Lavanya

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 !
1
mhn

レジストリにアクセスしてクライアントを構成し、LANGを変更します。 Oracleの場合、HLM\SOFTWARE\Oracle\KEY_ORACLIENT ... HOME\NLS_LANGに移動し、適切な言語に変更します。

1
Ziv.Ti

これがまだ問題かどうかわかりませんが、私はこの簡単な解決策を見つけました:

  1. Ole DBソースを右クリック
  2. 「編集」を選択します
  3. [入力および出力プロパティ]タブを選択します
  4. [入力と出力]で、[Ole DB Source Output]外部列と出力列を展開します
  5. [出力列]で、問題のあるフィールドを選択し、右側のパネルで[データ型プロパティ]が[外部列]プロパティのフィールドのプロパティと一致することを確認します

これが明確でわかりやすいことを願っています

1
Vuzi

解決済み-元の質問に:

これは前に見たことがあります。最も簡単な修正方法(すべてのメタデータはソース接続から利用できるため、これらのデータ変換手順をすべて必要としないでください):

OLE DBソースとOLE DB宛先を削除する遅延検証がFALSEであることを確認します(後でTrueに設定できます)クエリでOLE DBソースを再作成しますなど。すべての出力データ列タイプが正しいことをアドバンスドエディターで確認します。OLE DB宛先を再作成し、マップし、新しいテーブルを作成(または既存に再マップ)すると、SSISがすべて取得したことがわかります。データ型が正しい(ソースと同じ)。

上記のものが非常に簡単です。

1
randymaglio

ソースクエリ/ビュー/プロシージャのフィールドとして静的文字を選択し、ユニコードの宛先フィールドデータ型を選択すると、このエラーが発生する場合があります。

以下が直面した問題です:ソースで以下のスクリプトを使用しました

エラーメッセージ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
0
Sanjeev Bind

まだこの問題が発生している場合は、Oracle Clientのバージョンの違いに関連していることがわかりました。

完全な経験とソリューションをここに投稿しました: https://stackoverflow.com/a/43806765/923177

0
dayneo