首页 文章

SSIS - 派生列 - 子串/ Charindex - 语句时的情况

提问于
浏览
2

我有这个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)

但它给了我错误......

我该如何进行两次转换?

谢谢!

2 回答

  • 1

    您可以使用 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]
    
  • 0
    • 创建两个变量,如Name(String)和t(Int32) .

    • 使用两个表达式任务

    enter image description here

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

    Note: 在表达式中,您在SubString中使用-1,当名称中没有点( . )时,表达式将抛出错误 . FindString将给出0,因此不允许在外部SubString中使用0-1 . 第一个表达式已经检查了这个并且在没有点时将@ [User :: t]赋值为0,因为0-0不会出错 .

相关问题