为什么我的派生列表式不能给我预期的结果?

我从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/#### 

RIGHTexpression式应该有这样的结果:

####

注意: LEFTexpression式产生了所有有效的结果

以下是我的Taskstream程:

 Excel Source 

Copy ColumnDerived ColumnOle 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长度中减去斜杠字符的位置才能得到正确的结果。