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

w00*_*977 1 ssis

我有一个源列 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)
Run Code Online (Sandbox Code Playgroud)

长度是1。我需要把它改成100。我试过这个:

(DT_STR,100)(FINDSTRING(KEY,",",1) - 2) > 0 ?
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*iar 5

您的演员表缺少“Code_page”参数:

(DT_STR, 100, 1252) ((FINDSTRING(KEY,",",1) - 2) > 0 ? SUBSTRING(KEY,FINDSTRING(KEY,",",1) + 2,LEN(KEY) - FINDSTRING(KEY,",",1) - 1) : "")
Run Code Online (Sandbox Code Playgroud)

1252 是默认值。请参阅此答案以获得比我可以给出的为什么重要的更好的解释。有关投射/转换的更多信息,请参见此处


该列的元数据似乎仍设置为 1 个字符长。右键单击导出的列转换,选择显示高级编辑器,选择“输入和输出属性”。展开“派生列输出”->“输出列”-> 您的列(Key2在这种情况下我相信)。在“数据类型属性”下将长度编辑为 100。

SSIS 高级编辑器


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

流元数据

这将快速为您提供有关变量及其源组件的信息。不幸的是,它不会告诉您截断发生的确切位置,但是如果您的数据流组件不是太复杂,您仍然应该能够相对较快地找到问题区域。