SSIS - 派生列 - Substring/Charindex - Case when 语句
SSIS - Derived Column - Substring/Charindex - Case when statement
我有这个SQL代码:
Select [Name] = case when CHARINDEX(''.'', [Name])>0
then LEFT([Name],CHARINDEX(''.'', [Name])-1)
else [Name] end,
[System] = case when reverse(SUBSTRING(REVERSE( System),1,CHARINDEX('':'', REVERSE(System)))) like '':''
then ( System + ''\'')
else System end
我正在创建我的 SSIS 工作流,以便使用 SSIS 构建我的 ETL。为了创建上面的转换,我使用了派生列对象。
对于第一个语句,我尝试这样做:
ISNULL(SUBSTRING([Name],1,FINDSTRING([Name],".",1) - 1)) ? [Name] : SUBSTRING([Name],1,FINDSTRING([Name],".",1) - 1)
但是它给我错误...
如何进行这两个转换?
谢谢!
- 创建两个变量,例如 Name (String) 和 t (Int32)。
- 使用两个表情任务
- EXPR_Set_Flag_For_Dot:
@[User::t] = (FINDSTRING(@[User::Name], ".", 1) == 0 ? 0 : 1 )
- EXPR_Get_SubString:
FINDSTRING( @[User::Name] ,".",1) == 0 ? @[User::Name] : SUBSTRING( @[User::Name] ,1,FINDSTRING( @[User::Name] ,".",1) - @[User::t] )
.
注意: 在您的表达式中,您在 SubString 中使用 -1,当名称中没有点 (.) 时,表达式将抛出错误。 FindString 将给出 0,因此不允许在外部 SubString 中使用 0-1。第一个表达式已经检查了这一点,并在没有点时为 @[User::t] 分配 0,因此 0-0 不会通过错误。
您可以使用 Expression Task
来实现此目的
对于[Name]
表达式你可以使用下面的
@[User::Name] = FINDSTRING( @[User::Name] ,".",1) == 0 ? @[User::Name] : LEFT(SUBSTRING( @[User::Name] ,1,FINDSTRING( @[User::Name] ,".",1) ), LEN(SUBSTRING(@[User::Name] ,1,FINDSTRING( @[User::Name] ,".",1))) -1)
SUBSTRING
不允许从长度中减去 -1 你可以使用 LEFT
来实现这个
对于[System]
表达式你可以使用下面的
@[User::System] = REVERSE(SUBSTRING(REVERSE(@[User::System]),1,FINDSTRING( REVERSE(@[User::System]),":",1))) == ":" ? @[User::System] + "\" : @[User::System]
我有这个SQL代码:
Select [Name] = case when CHARINDEX(''.'', [Name])>0
then LEFT([Name],CHARINDEX(''.'', [Name])-1)
else [Name] end,
[System] = case when reverse(SUBSTRING(REVERSE( System),1,CHARINDEX('':'', REVERSE(System)))) like '':''
then ( System + ''\'')
else System end
我正在创建我的 SSIS 工作流,以便使用 SSIS 构建我的 ETL。为了创建上面的转换,我使用了派生列对象。 对于第一个语句,我尝试这样做:
ISNULL(SUBSTRING([Name],1,FINDSTRING([Name],".",1) - 1)) ? [Name] : SUBSTRING([Name],1,FINDSTRING([Name],".",1) - 1)
但是它给我错误...
如何进行这两个转换?
谢谢!
- 创建两个变量,例如 Name (String) 和 t (Int32)。
- 使用两个表情任务
- EXPR_Set_Flag_For_Dot:
@[User::t] = (FINDSTRING(@[User::Name], ".", 1) == 0 ? 0 : 1 )
- EXPR_Get_SubString:
FINDSTRING( @[User::Name] ,".",1) == 0 ? @[User::Name] : SUBSTRING( @[User::Name] ,1,FINDSTRING( @[User::Name] ,".",1) - @[User::t] )
.
注意: 在您的表达式中,您在 SubString 中使用 -1,当名称中没有点 (.) 时,表达式将抛出错误。 FindString 将给出 0,因此不允许在外部 SubString 中使用 0-1。第一个表达式已经检查了这一点,并在没有点时为 @[User::t] 分配 0,因此 0-0 不会通过错误。
您可以使用 Expression Task
来实现此目的
对于
[Name]
表达式你可以使用下面的@[User::Name] = FINDSTRING( @[User::Name] ,".",1) == 0 ? @[User::Name] : LEFT(SUBSTRING( @[User::Name] ,1,FINDSTRING( @[User::Name] ,".",1) ), LEN(SUBSTRING(@[User::Name] ,1,FINDSTRING( @[User::Name] ,".",1))) -1)
SUBSTRING
不允许从长度中减去 -1 你可以使用 LEFT
来实现这个
对于
[System]
表达式你可以使用下面的@[User::System] = REVERSE(SUBSTRING(REVERSE(@[User::System]),1,FINDSTRING( REVERSE(@[User::System]),":",1))) == ":" ? @[User::System] + "\" : @[User::System]