2013-04-09 5 views
5

Mam zmienną de_sters, zmienną typu string, jak jest zdefiniowana w moim pakiecie SSIS, jej zasięg to pakiet SSIS, które muszę do fill z wartością kilku linii z jednej tabeli, z pakietem Execute Sql Task.Typ wartości przypisanej do zmiennej "User :: de_sters" różni się od bieżącej zmiennej o typie

Konkluzja jest taka, że ​​mam pakiet „Wykonanie zadań SQL”, w właściwościach -> „sql” Mam napisał:

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

Następnie w Result Set Wybrałem Single Row (pierwszy ja prowadził mój wybierz i zobaczyłem, że zwraca tylko jedną linię). Następnie na zakładce Result Set (lewa strona) napisałem w Result Name pole Result (alias z mojego poprzedniego wyrażenia sql) iw zgłoszeniu Variable Name napisałem User::de_sters.

Ale kiedy uruchomić zadanie SQL daje mi

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

pomocy, lub podpowiedzi?

+0

@praveen: Witam, powraca rachunku dziura: 'Jan', 'Kowalski', 'Kowal' zamiast (line1) John (line2) doe (Line3) Smith. W przypadku mojego pakietu muszę mieć ciąg "john", "doe", "smith" załadowany w zmiennej "de_sters", ponieważ pomaga mi później usunąć coś z innej bazy danych. Dlatego też, jeśli prowadziłoby to do dołka, zwróci tylko "john", "doe", "smith". – BogdanM

Odpowiedz

5

Problem polega na tym, że SSIS nie rozumie varchar(max) jako typu danych. Musisz określić wartość limit .Jasta zmiana max na 8000.

declare @s varchar(8000) = '' 

Jeśli łańcuch jest bardzo duża a następnie użyć FullResultSet z varchar(max) w zapytaniu i zapisać wartość w zmiennej, której dane typ jest object.

Teraz w celu uzyskania dostępu do wykorzystywania obiektów Script task lub Script component (Data Flow) i napisać poniższy kod, aby wyodrębnić wartości z object zmiennej

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

Dziękuję bardzo praveen. Miłego dnia:) – BogdanM

0

załadować varchar(max) dziedzinie w SQL Script Tasks w Control flow Do zmienna łańcuchowa, powinieneś podzielić ją na mniejsze fragmenty, np. varchar(4000) i załadować je do object, aw ciągu następnego kroku dodać foreach loop container aby połączyć je z powrotem do zmiennej string,

aby podzielić duży tekst na mniejsze tekstami wierszy można użyć następującej procedury przechowywanej:

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; 

następnie dodać następujące wyrażenie w zadaniu ekspresji zawartych przez pojemnik foreach nad rzędami i concat je z powrotem do jednego łańcucha,

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

asd asd asd asd asd