我从Excel工作表中提取数据并转换并加载到Sql Server
2012
。我正在尝试对某个列Derived Column
执行'RegistrationNumber'
转换。
'RegistrationNumber'
采用以下格式,并非所有固定长度:
###/####
###/####
###/####
###/####
###/####
###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/####
X###/AB
XYZ##/###
XYZ##/###
ABS###/####
ABCSEDG###FG/####
我需要接受LEFT
的{{1}}并在'/'
上添加一列,我必须接受SQL Server
的{{1}}和将其放在RIGHT
中的不同列中:
以下是我'/'
转换中的表达式:
SQL server
对于大多数结果,它做了我想要的。但是其中一些我得到的结果如下:
derived column
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
表达式产生了所有有效结果
以下是我的####
流程:
LEFT
到Task
到Excel Source
到Copy Column
答案 0 :(得分:1)
LEFT是" new"随着2012年发布的SSIS,所以我提供了使用子字符串的公式,仍然是2005/2008年的人们
在它的核心,你的正确电话是切掉最后N个字符,但你传递的长度是找到斜线的位置。相反,该位置是字符串的长度,而不是斜杠位置
至于Excel vs CozyRoc与其他任何东西。这将是基于意见的,但我发现当我能够以平面文件格式(分隔或固定宽度)获取数据时,我取得了最大的成功。假设不是一个选项,那么我通常更喜欢用Excel编写查询而不是使用本机表。
答案 1 :(得分:1)
RIGHT([Copy of RegistrationNumber],FINDSTRING([Copy of RegistrationNumber],"/",1) - 1)
在斜杠字符右侧获取字符串是不正确的。
例如,对于X###/AB
,函数RIGHT应复制2个字符。但FINDSTRING返回5,减去1,得到值4.因此,RIGHT返回X###/AB
的最后4个字符。
所以你需要从字符串的长度中减去斜杠字符的位置以获得正确的结果。