2017-05-03 51 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