非Unicode文字列をUnicode文字列SSISに変換する


9

データベースからデータを空のExcelファイルにエクスポートするパッケージを作成しています。ソースコンポーネントと宛先コンポーネントのみを追加してパッケージを実行すると、出力列と列 "A"はUnicodeと非Unicodeの文字列データ型の間で変換できないという変換エラーが発生しました。

これを修正するために、データ変換コンポーネントを追加し、すべての列を

「Unicode文字列[DT_WSTR]」

エラーはもう発生しません。唯一の問題は、約50列あり、1つずつ移動して、ドロップダウンリストから[Unicode String [DT_WSTR]]を選択する必要があることです。次に、宛先コンポーネントに移動し、新しく変換された列をExcelファイルにマップする必要がありました。

私の質問は、他の誰かがこれに遭遇した場合、すべての手動の​​データ型変換を行わなければならないより効率的な方法はありますか?すべての列を1つずつ変換してマップする必要があるのは、特に行数が多い場合は現実的ではないようです。

Excelファイルはデータのインポートとエクスポートに最適な方法ではないことを理解していますが、この特定のケースではExcelファイルが必要です。

フラットテキストファイルにエクスポートして、パッケージの最後のステップとしてExcelに変換する方法を探す場合があります。私はこれが同じユニコード/非ユニコード変換エラーを引き起こさないことを期待しています。


その後の手根管症候群はどうですか?:-)
Patrick Honorez

データの移動先のテーブルがUnicodeデータ型を使用していることを確認してください(例:varchar(50)ではなくnvarchar(50))
MacGyver

回答:


15

RDCの代わりに、SSISでのデータ型の変換をスキップして、ソースクエリでnvarcharとして明示的にキャストします。

使用法

ソースクエリでは(そして、あなたはされているソースクエリを使用していないだけで、ドロップダウンでテーブルを選択)、明示的に適切なn個(VAR)CHAR長に物事をキャスト。

の代わりに

SELECT
    E.BusinessEntityID
,   E.NationalIDNumber
,   E.LoginID
,   E.JobTitle
,   E.BirthDate
,   E.MaritalStatus
,   E.Gender
FROM
    HumanResources.Employee AS E

次のようなクエリを使用します

SELECT
    CAST(E.BusinessEntityID AS nvarchar(10)) AS BusinessEntityID
,   CAST(E.NationalIDNumber AS nvarchar(15)) AS NationalIDNumber
,   CAST(E.LoginID AS nvarchar(256)) AS LoginID
,   CAST(E.JobTitle AS nvarchar(50)) AS JobTitle
,   CAST(E.BirthDate AS nvarchar(10)) AS BirthDate
,   CAST(E.MaritalStatus AS nchar(1)) AS MaritalStatus
,   CAST(E.Gender AS nchar(1)) AS Gender
FROM
    HumanResources.Employee AS E

アドベンチャーワークスの賢明な学生は、データがすでにn(var)charタイプであると認識しますが、これは単に概念を示すためのものでした。

利点

  • 使用されるメモリが少ない。現在、Data Conversion ComponentSSISのを使用して、「同じ」データの2つのコピーを割り当てて保存します。
  • RSIなし。N回クリックして、それらすべてが提供する恐ろしい小さなエディターですべての情報を指定する必要はありません。「Excel対応」テーブルエクスポートの生成をさらに自動化するために、dmv / information_schemaに対するクエリを使用します。
  • カスタムコンポーネントのインストールはありません。私は、オープンソースのインストールが禁止されている場所で働いてきました。そこに同じアプリがあなたのコードを維持することをインストールするには、今、「みんな」のニーズとして、サードパーティのアプリをインストールする繰延メンテナンスコストもあるし、それがサーバーにインストールを取得する必要がある彼らはしている有効にするためにアセンブリを精査するためにINFOSECニーズそして私たちはあなたを上回っbajillion人からサインオフを必要とします...

1
「RDCの代替として」-RDCとは何ですか?次の回答を読むと、データコンポーネントの置き換えを意味していると思いますが、元の投稿の作成者がそのコンポーネントについて言及していないため、頭字語としては早すぎるかもしれません。:-)
Thronk 2013

RSIについて言えば、議論が前面に出ているため、CONVERT50回貼り付ける方が簡単です。CAST
Patrick Honorez


2

「Unicode文字列(DT_WSTR)」から「文字列(DT_STR)」またはその逆に変更するだけの場合は、次のようにします。

  1. package.dtsx-ファイルのコピーを保存します(回復する必要がある場合)
  2. エディターでpackage.dtsxを開くか、MS Visual Studioでパッケージを右クリックして[コードの表示]を選択します。XMLファイルが表示されます。

文字列のDTS:DataType後に= "130"が続く場合は、その文字列を検索し、列はDT_WSTR(ユニコード)として定義されます。

= "129"が後に続く場合、列はDT_STR(非ユニコード)として定義され、検索と置換に注意してください(以前にコピーを作成しましたよね?)

ファイルを保存すると、おそらくこれで完了です。


1
DBA SEへようこそ!プロのヒント:このサイトには、投稿の見栄えをよくするためのさまざまなテキストフォーマット機能があります。エディターのテキストボックスの上部にあるアイコンを使用します。
peterh-モニカを復活させる'08年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.