带表达式的 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" 可用:
这将使您快速一目了然地了解有关变量及其源组件的信息。不幸的是,它不会准确地告诉您 哪里 截断发生了,但是如果您的数据流组件不是太复杂,您应该仍然能够相对快速地找到问题区域。
我有一个源列 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" 可用:
这将使您快速一目了然地了解有关变量及其源组件的信息。不幸的是,它不会准确地告诉您 哪里 截断发生了,但是如果您的数据流组件不是太复杂,您应该仍然能够相对快速地找到问题区域。