2013-04-09 2 views
5

変数はde_stersです。これは文字列型変数で、SSISパッケージで定義されているため、私はfillに1つのテーブルから数行の値をとり、Execute Sql Taskパッケージを使用します。変数 "User :: de_sters"に割り当てられている値の型が現在の変数の型と異なる

ボトムラインは、私は礼儀では、「SQL実行タスクの実行」のパッケージを持っているということです - >「SQL文が」私が書いている:

declare @s varchar(max) = '' 
select @s = case when @s <> '' 
        then @s + ',''' + employer_name + '''' 
        else @s + '''' + employer_name+ '''' 
        end 
from employers 
select @s as Result 

その後、Result Setで私はSingle Rowは(最初、私が走っている選択された私の私はそれが1行だけを返すことを見た)。次に、タブResult Set(左側)にResult NameフィールドResult(私の以前のsqlステートメントのエイリアス)に書き込んで、Variable NameUser::de_stersと書きました。

しかし、私は、SQLタスクを実行すると、それは私に

The type of the value being assigned to variable "User::de_sters" 
differs from the current variable type" error. 

すべてのヘルプ、またはヒントを与えますか?

+0

@praveen:こんにちは、穴文を返す: 'ジョン'、 'DOE'、「スミスの代わりに(LINE1)ジョン(LINE2)DOE(LINE3)スミス。私のパッケージでは、変数 "de_sters"にロードされた正確な文字列 'john'、 'doe'、 'smith'を後で別のデータベース上のものを削除するのに役立てる必要があります。したがって、実行された場合、穴のステートメントは 'john'、 'doe'、 'smith'のみを返します。 – BogdanM

答えて

5

問題はSSISがデータ型としてvarchar(max)を理解していないことです。limitを指定する必要があります。maxの値を8000に変更してください。あなたの文字列が非常に大きい場合

declare @s varchar(8000) = '' 

その後、クエリにvarchar(max)でFullResultSetを使用して、データ型がobjectをある変数に値を格納。

Control flowSQL Script Tasksvarchar(max)フィールドをロードするためにobject可変

OleDbDataAdapter oleDA = new OleDbDataAdapter(); 
DataTable dt = new DataTable(); 
oleDA.Fill(dt, Dts.Variables["User::YourVariable"].Value); 
foreach (DataRow rowLoop in dt.Rows) 
    { 
     MessageBox.Show (rowLoop[0].ToString()); 
    } 
+0

ありがとうございました。すてきな一日を:) – BogdanM

0

から値を抽出するために以下のコードをオブジェクト利用Script taskまたはScript component(データフロー)にアクセスして書き込むために文字列変数の場合は、小さな塊に分割する必要があります。 varchar(4000)objectにそれらをロードし、次のステップでは、次のストアドプロシージャを使用することができます行として小さなテキストに大きなテキストを分割するために、バックstring変数に

を、それらを組み合わせることforeach loop containerを追加中:

CREATE PROCEDURE SSIS_VarcharMax_Loader 
    @Input varchar(max) , 
    @maxRowLength int = 50 
AS 
BEGIN 
SET NOCOUNT ON 


;WITH 
    tmp(inp,c,rn) as (
       select @Input,SUBSTRING(@Input, 1,@maxRowLength),@maxRowLength 
      union all 
       select @Input,SUBSTRING(@Input,rn,@maxRowLength),rn + @maxRowLength 
       from tmp 
       where rn < len(@Input) 
     ) 
     select c from tmp 
     OPTION (MAXRECURSION 500); 

END; 

、その後、行を超えるforeachのコンテナに含まれる表現タスクに次の式を追加し、戻って1つの文字列にそれらをCONCAT

@strResult = (ISNULL(@[User::strResult])?"": @[User::strResult])+ @[User::str] 

asd asd asd asd asd