2017-05-03 53 views
2

我有这样的SQL代码:SSIS - 派生列 - 子串/ CHARINDEX - 案例时声明

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) 

但它给我的错误...

我怎样才能让这两个转变?

谢谢!

+0

什么是你所得到的错误?您在名称列中获得什么类型的值? – observer

+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] 
    
+0

@PedroAlves高兴地提供帮助。这是一个有用的问题。我把它提高了。祝你好运 – Hadi

1
  1. 创建两个变量,如Name(String)和t(Int32)。
  2. 使用两种表达任务

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])
  • 注:(。)在你表达你在使用的子-1,当没有点的名字,表达将抛出错误。 FindString会给0,所以0-1在外部SubString中是不允许的。第一个表达式已经检查了这一点,并且在没有点的情况下将@ [User :: t]赋给0,因为0-0不会出错。

    +0

    顶部!:)第一个声明工作完美:)对于第二个声明,你知道如何在SSIS中使用Reverse()函数吗? –

    +0

    https://docs.microsoft.com/en-us/sql/integration-services/expressions/reverse-ssis-expression – Hadi