带表达式的 SSIS 派生列系统可变长度

SSIS Derived Column System Variable Length with expression

我有一个源列 KEY2,我需要在 SSIS 的派生列转换中对其执行一些字符串操作。配置如下

KEY2        
Replace 'KEY2'  

(FINDSTRING(KEY,",",1) - 2) > 0 ? 
  SUBSTRING(KEY,FINDSTRING(KEY,",",1) + 2,LEN(KEY) - FINDSTRING(KEY,",",1) - 1) : ""

string [DT_STR]     
1                       
1252  (ANSI - Latin I)

长度是1,我需要改成100,我试过这个:

(DT_STR,100)(FINDSTRING(KEY,",",1) - 2) > 0 ?

SUBSTRING(KEY,FINDSTRING(KEY,",",1) + 2,LEN(KEY) - FINDSTRING(KEY,",",1) - 1) : ""

但是,系统提示解析错误。有什么问题?

更新

我已经关注了 markTheLiars 的回答。表达式现在看起来像这样:

KEY2        Replace 'KEY2'      (DT_STR,100,1252)((FINDSTRING(KEY,",",1) - 2) > 0 ? 
SUBSTRING(KEY,FINDSTRING(KEY,",",1) + 2,LEN(KEY) - FINDSTRING(KEY,",",1) - 1) : "")     string [DT_STR]     1                       1252  (ANSI - Latin I)

表达式编译并运行,但是我提示相同的错误,因为即使有转换,长度也不会改变。

您的转换缺少 "Code_page" 参数:

(DT_STR, 100, 1252) ((FINDSTRING(KEY,",",1) - 2) > 0 ? SUBSTRING(KEY,FINDSTRING(KEY,",",1) + 2,LEN(KEY) - FINDSTRING(KEY,",",1) - 1) : "")

1252 是默认值。有关 casting/conversions 的更多信息,请参阅 this answer for a much better explanation than I could give as to why it's important. See here


该列的元数据似乎仍设置为 1 个字符长。右键单击派生列转换,select 显示高级编辑器,select "Input and Output Properties"。展开 "Derived Column Output" -> "Output Columns" -> 你的专栏(我相信在这个例子中是 Key2)。在 "Data Type Properties" 下,将长度编辑为 100。


正如最终发现的那样,问题不在于此组件,而是在数据到达此日期流组件之前截断数据的 previous 组件。在这种情况下,确定哪个组件导致截断的最简单方法是使用元数据查看器,通过双击流路或右键单击并 selecting "Edit" 可用:

这将使您快速一目了然地了解有关变量及其源组件的信息。不幸的是,它不会准确地告诉您 哪里 截断发生了,但是如果您的数据流组件不是太复杂,您应该仍然能够相对快速地找到问题区域。