2013-04-09 20 views
5

geçerli değişken türünden farklıdır. 0,değişkenim var, SSIS paketimde tanımlandığı gibi bir string tip değişkeni, kapsamı SSIS paketi, fill için bir tablodan birkaç satır değerine ihtiyacım var, bir Execute Sql Task paket."User :: de_sters" değişkenine atanan değerin türü,

Alt satırda adap içinde, bir "SQL görev Yürüt" paket olması -> "SQL Bildirimi" Ben yazdım adres:

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

Sonra Result Set azından ben Single Row (ilk kaçtım gelmiş seçilmiş benim seçin ve sadece bir satır döndürdüğünü gördüm). Daha sonra Result Set sekmesinde (sol taraf)alanına Result (önceki sql ifademden gelen diğer ad) alanına yazdım ve Variable Name dosyamda User::de_sters yazdım.

Ama sql görevi çalıştırdığınızda bana

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

Herhangi yardım veya ipuçları verir?

+0

@praveen asd : Merhaba, delik deyimi döndürür: 'john', 'Doe' yerine (satırı1) john (satırı2) doe (satırı3) smith ait 'smith'. Paketim için, "de_sters" değişkenine yüklenen "john", "doe", "smith" tam dizesine ihtiyacım var, çünkü daha sonra farklı bir veri tabanındaki bir şeyi silmek için bana yardımcı oluyor. Bu nedenle eğer koşarsa delik ifadesi sadece 'john', 'doe', 'smith' döner. – BogdanM

cevap

5

sorun SSIS .Arzu limit .Sadece 8000 için max değerini değiştirmek belirtmek gerekir veri türü olarak varchar(max) anlamıyor olduğunu. dize çok büyükse

declare @s varchar(8000) = '' 

ardından sorguda varchar(max) ile FullResultSet kullanmak ve veri türü object olan bir büyüklüğün değerini depolar.

Şimdi üzere Control flow içinde SQL Script Tasks içinde varchar(max) alanını yüklemek için object değişken

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

Çok teşekkürler övgü. İyi günler:) – BogdanM

0

değeri ayıklamak için aşağıdaki kodu nesne kullanımını Script task veya Script component (Veri Akış) erişebilir ve yazmak için dize değişkeni, örneğin daha küçük parçalara ayırmalısınız. varchar(4000) ve Saklı Aşağıdaki prosedür bir object onları yüklemek ve bir sonraki adıma dahilinde

kullanabilirsiniz satırları gibi daha küçük metinlere büyük metni bölmek için, bir string değişkene onları geri birleştirmek için bir foreach loop container ekleyin:

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; 

ardından satırların üzerine bir foreach kap içerdiği bir ifade görev aşağıdaki ifadeyi ekleyin ve tekrar bir dizeye onları Concat

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

asd asd