为什么我的派生列表式不能给我预期的结果?
我从Excel工作表中提取数据并转换并加载到Sql Server
2012
。 我正在尝试对某个列'RegistrationNumber'
执行Derived Column
转换。
'RegistrationNumber'
的格式如下,并非全部固定长度:
###/#### ###/#### ###/#### ###/#### ###/#### ###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/#### X###/AB XYZ##/### XYZ##/### ABS###/#### ABCSEDG###FG/####
我需要把'/'
的LEFT
加上一个SQL Server
列,我必须把'/'
的RIGHT
放在SQL server
的不同列中:
以下是我的derived column
转换中的expression式:
Derived Column: RegistrationNumber Derived Column: Replace 'RegistrationNumber' Expression: LEFT([RegistationNumber],FINDSTRING([RegistrationNumber],"/",1) - 1) Data Type: Unicode string [DT_WSTR] Length: 255 Derived Column: Copy of RegistrationNumber Derived Column: Replace 'Copy of RegistrationNumber' Expression: RIGHT([Copy of RegistrationNumber],FINDSTRING([Copy of RegistrationNumber],"/",1) - 1) Data Type: Unicode string [DT_WSTR] Length: 255
对于大部分的结果,它做了我想要的。 但是其中一些我得到如下结果:
/#### ##/AA #/#### A###XY/####
RIGHT
expression式应该有这样的结果:
####
注意: LEFT
expression式产生了所有有效的结果
以下是我的Task
stream程:
Excel Source
Copy Column
到Derived Column
到Ole DB Command
在2012年发布的SSIS中,LEFT是“新”,所以我提供了2005/2008年仍然使用子string的公式
- SlashPosition = FINDSTRING(RegistrationNumber,“/”,1)
- LEFT = LEFT(RegistrationNumber,(SlashPosition – 1))
- SUBLEFT = SUBSTRING(RegistrationNumber,1,(SlashPosition – 1))
- RIGHT = RIGHT(RegistrationNumber,LEN(RegistrationNumber) – (SlashPosition))
- SUBRIGHT = SUBSTRING(RegistrationNumber,(SlashPosition + 1),LEN(RegistrationNumber) – SlashPosition)
在它的核心,你的正确的呼叫是切断最后的N个字符,但你的传球的长度是在哪里find斜线的位置。 相反,该位置是string的长度,而不是斜线位置
至于Excel vs CoszyRoc vs其他。 这将基于意见,但我发现我有最好的成功,当我可以得到我的数据在平面文件格式(分隔或固定宽度)。 假设这不是一个选项,那么我通常宁愿写Excel的查询比使用本地表的东西。
RIGHT([Copy of RegistrationNumber],FINDSTRING([Copy of RegistrationNumber],"/",1) - 1)
获取斜线字符的右侧string是不正确的。
例如对于X###/AB
,RIGHTfunction应该复制2个字符。 但是FINDSTRING返回5,减1后得到4,所以RIGHT返回X###/AB
的最后4个字符。
所以你需要从string长度中减去斜杠字符的位置才能得到正确的结果。