SSIS派生列系统变量长度(带表达式)

SSIS派生列系统变量长度(带表达式),ssis,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 1

我有一个源列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 ?
子字符串(键,FINDSTRING(键,,,,,,,,1)+2,LEN(键)-FINDSTRING(键,,,,,,,,1)-1):“”

但是,系统会提示我一个解析错误。有什么问题

更新

我已经听从了马克提亚的回答。表达式现在如下所示:

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)
表达式将编译并运行,但我会收到相同的错误提示,因为即使有强制转换,长度也不会更改。

您的强制转换缺少“代码页”参数:

(DT_STR, 100, 1252) ((FINDSTRING(KEY,",",1) - 2) > 0 ? SUBSTRING(KEY,FINDSTRING(KEY,",",1) + 2,LEN(KEY) - FINDSTRING(KEY,",",1) - 1) : "")
1252是默认值。请看一个比我能给出的更好的解释,为什么它很重要。有关强制转换/转换的更多信息,请参见


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


最终发现,问题不在这个组件中,而是在数据到达这个日期流组件之前截断数据的前一个组件。在这种情况下,确定导致截断的组件的最简单方法是使用元数据查看器,双击流程或右键单击并选择“编辑”即可:

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

您的cast缺少“Code\u page”参数:

(DT_STR, 100, 1252) ((FINDSTRING(KEY,",",1) - 2) > 0 ? SUBSTRING(KEY,FINDSTRING(KEY,",",1) + 2,LEN(KEY) - FINDSTRING(KEY,",",1) - 1) : "")
1252是默认值。请看一个比我能给出的更好的解释,为什么它很重要。有关强制转换/转换的更多信息,请参见


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


最终发现,问题不在这个组件中,而是在数据到达这个日期流组件之前截断数据的前一个组件。在这种情况下,确定导致截断的组件的最简单方法是使用元数据查看器,双击流程或右键单击并选择“编辑”即可:



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

我认为cast缺少一个参数。试试
(DT_STR,1001252)
@mikeTheLiar,我已经试过你的建议了。这次的错误是:数据类型DT_WSTR和DT_I4与二进制运算符“>”不兼容。您需要将整个语句包装在一个组中(它在第一个元素上执行强制转换,然后在需要时执行比较around@mikeTheLiar,我想这就是我要做的。我该如何组成这个小组?谢谢。如果你看一看这句话,你在第一次比较之前遗漏了一个
)。
(FINDSTRING(KEY,,,“,1)-2)正在对语句而不是结果进行强制转换。只需在强制转换后将整个内容包装起来即可
()
。第二个问题归结为不匹配的parensI我认为强制转换缺少一个参数。请尝试
(DT_STR,1001252)
@mikeTheLiar,我试过你的建议。这次错误是:数据类型DT_WSTR和DT_I4与二进制运算符“>”不兼容。然后你要将整个语句包装在一个组中(它在第一个元素上执行强制转换,然后在需要时执行比较around@mikeTheLiar,我想这就是我要做的。我该如何组成这个小组?谢谢。如果你看一看这句话,你在第一次比较之前遗漏了一个
)。
(FINDSTRING(KEY,,,“,1)-2)正在强制转换语句而不是结果。只需在强制转换后包装整个内容
。第二个问题归结为不匹配的parenst没有输出列。我尝试添加一个名为“KEY2”的列,但出现编译错误:所有派生列都必须具有唯一的名称。我通过更改源组件:KEY2的输出列的长度快速解决了这个问题。您的回答几乎正确。这是最好的答案。啊,是的。这是有道理的。如果以前的组件正在截断输入,那么它必须在那里进行修复。如果您还不知道,您可以右键单击组件之间的路径并查看元数据-这在过去几次对我很有帮助。我不知道您可以通过右键c查看元数据点击路径。你能用这些信息修改这个问题以备将来参考吗?+1.Done。不幸的是,SSI有时是相当难以捉摸的。当它起作用时,它很好-当它不起作用时,它会让你想撕掉你的头发。没有输出列。我尝试添加一个名为“KEY2”的列,并提示我编译错误r:所有派生列都必须有唯一的名称。我通过更改out的长度很快解决了这个问题