2013-04-09 75 views
5

我有一個變量de_sters,它是在我的SSIS包中定義的一個字符串類型變量,其範圍是SSIS包,我需要fill與一個表中的幾行的值,請使用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(第一我已經跑了我選擇,我看到它只返回一行)。然後在選項卡Result Set(左側)我寫在Result Name字段Result(別名從我以前的sql語句),並在Variable Name提交我寫了User::de_sters

但是當我運行SQL任務它給了我

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

任何幫助,或提示?

+0

@praveen:你好,孔語句返回: '約翰', '母鹿',而不是(線1)約翰(2號線)能源部(3號線)史密斯史密斯。對於我的包,我需要在變量「de_sters」中加載確切的字符串'john','doe','smith',因爲它稍後會幫助我刪除不同數據庫上的內容。因此,如果運行該洞聲明將只返回'john','doe','smith'。 – BogdanM 2013-04-09 11:49:37

回答

5

問題是SSIS不瞭解varchar(max)作爲數據類型。您需要指定limit。只需將max的值更改爲8000即可。

declare @s varchar(8000) = '' 

如果字符串是非常大的,然後在查詢中使用FullResultSet與varchar(max)和值存儲在數據類型爲object變量。

現在,爲了訪問該對象使用Script taskScript component(數據流)和寫下面的代碼,以提取從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 2013-04-09 14:54:13

0

的值要在Control flow加載內SQL Script Tasks一個varchar(max)字段到字符串變量,你應該把它分成更小的塊,例如。 varchar(4000)並將它們加載到object,並對下一步中添加一個foreach loop container他們回來結合到string變量,

拆分大文本,以較小的文本,你可以使用行以下存儲過程:

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容器包含在表達任務和Concat的他們回到一個串,

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

asd asd asd asd asd