为什么我的Derived Column Expression没有给我我期望的结果?

时间:2014-05-29 18:22:48

标签: sql-server regex excel ssis

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

TaskExcel Source Copy Column

2 个答案:

答案 0 :(得分:1)

LEFT是" new"随着2012年发布的SSIS,所以我提供了使用子字符串的公式,仍然是2005/2008年的人们

  • 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)

enter image description here

在它的核心,你的正确电话是切掉最后N个字符,但你传递的长度是找到斜线的位置。相反,该位置是字符串的长度,而不是斜杠位置

enter image description here

至于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个字符。

所以你需要从字符串的长度中减去斜杠字符的位置以获得正确的结果。