2016-08-19 18 views
0

これについては高低に検索されていますが、多くの提案がありますが、それは何も役に立ちません。我々は、テキスト型の列にSQLクエリを格納するフィールドを持つテーブルを持っており、その後、他のオブジェクトによってクエリが呼び出されるため、特定の文字をエスケープする必要があります。SSIS 2012はSQLの実行タスクの結果セットを切り捨てます

私はすばらしい作品を作成するためのSQLコードを作成しました。問題は、Execute SQLタスクを実行して結果をString変数に代入すると、テキストが一見無作為に切り捨てられます。最新の試行で4184文字が4058に切り捨てられました。

SSISではnvarcharが4000文字に制限されています。 1つの提案は、nvarchar(max)ソースデータ型とObject変数型を使用することでした。

"結果を型(DBTYPE_WSTR)の変数に抽出する際にエラーが発生しました"。

もう1つは、ソースクエリでntextを使用することでした。このエラーで失敗します:

"text、ntext、およびimageデータ型はローカル変数には無効です。"

何か不足していますか?長い文字列をExecute SQL結果セット変数に入れる正しい方法は何ですか?

ここでは、SQLコマンドを取得するための元のコードですが、機能するコードは切り詰められます。 IDはエスケープされた一重引用符をIDの周りに置きます。 (彼らは文字を含めることができるため、これらの特定のIDはVARCHARです。)

DECLARE @IDList VARCHAR(8000) 
SELECT @IDList = COALESCE(@IDList + ', ', '') + '''''' + PersonID + '''''' 
FROM tmpGroup 

select '''SELECT SystemID 
FROM People 
WHERE PersonID IN (' + @IDList + ')''' AS GroupSQL 

は、それが動作しているようにのみソース・データ・タイプだから、それはVARCHAR(8000)を使用します。

+2

私はこのためにストアドプロシージャを使用する傾向があります。したがって、私のExecute SQLタスクは通常、ストアドプロシージャにパラメータを渡すだけです。 –

+0

長さの問題を回避するためにこれらのアイデアを具体的に試してみませんでしたが、他の方法でも同様のテクニックを使用しました...とにかく、データフローを使用してDBから選択し、ODBC Recordset変数(オブジェクト)後でforeachループなどで再帰する必要があります。または、ソースからスクリプトコンポーネントに移動し、その値で文字列変数を設定します。データフローソースコンポーネントのテキスト入力ボックスにある8000文字の制限に遭遇するかどうかはわかりませんが、後でその変数を使用して後で使用するかどうかはわかりません。またはすぐに変数にスクリプトタスク... – Matt

答えて

0

Iは、以下と同様の問題を修正:

  1. でSQL実行タスクが - ResultSetを設定=全結果はを設定し、結果セットとしてオブジェクト変数(VObj)を割り当てます。
  2. このタスクの後、Foreach ADO列挙子を作成し、Vobjをソース変数(see good walk through article)として処理し、最初の変数を一部のString変数に割り当てます。

説明されたアプローチでは、SQLからSSIS文字列変数に長い文字列(それ以上8Kシンボル)を転送することができました。

+0

それは、ありがとう!ストアドプロシージャにクエリーを置くMattの方法もうまくいきます---実際にはすでに他のタスク用のストアドプロシージャがありましたので、そのコードを含めて終了しました。 –

関連する問題