2017-05-03 6 views
2

J'ai ce code SQL:SSIS - Dérivé Colonne - Substring/Charindex - cas où la déclaration

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 

Et je crée mon flux de travail SSIS afin de construire mon ETL SSIS à l'aide. Pour créer les transformations ci-dessus, j'utilise un objet colonne dérivé. Pour la première déclaration que j'essaie ceci:

ISNULL(SUBSTRING([Name],1,FINDSTRING([Name],".",1) - 1)) ? [Name] : SUBSTRING([Name],1,FINDSTRING([Name],".",1) - 1) 

Mais il me donne l'erreur ...

Comment puis-je faire que deux transformations?

Merci!

+0

Quelle est l'erreur que vous obtenez? Quel type de valeur obtenez-vous dans la colonne Nom? – observer

+0

Il ne me donne aucun résultat ...; ( –

Répondre

0

Vous pouvez utiliser Expression Task pour atteindre cet

  • Pour [Name] expression, vous pouvez utiliser les éléments suivants

    @[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 ne permettent pas de soustraire -1 de longueur, vous pouvez utilisez LEFT pour y parvenir

  • Pour [System] expression, vous pouvez utiliser les éléments suivants

    @[User::System] = REVERSE(SUBSTRING(REVERSE(@[User::System]),1,FINDSTRING(REVERSE(@[User::System]),":",1))) == ":" ? @[User::System] + "\\" : @[User::System] 
    
+0

@PedroAlves heureux de vous aider. C'est une question utile. Je l'ai upvoted. Bonne chance – Hadi

1
  1. Créez deux variables telles que Name (Chaîne) et t (Int32).
  2. Utilisez deux tâches d'expression

enter image description here

  1. EXPR_Set_Flag_For_Dot: @[User::t] = (FINDSTRING(@[User::Name], ".", 1) == 0 ? 0 : 1)
  2. EXPR_Get_SubString: FINDSTRING(@[User::Name] ,".",1) == 0 ? @[User::Name] : SUBSTRING(@[User::Name] ,1,FINDSTRING(@[User::Name] ,".",1) - @[User::t]).

Note: (.) ​​ Dans votre expression que vous utilisez -1 dans la sous-chaîne, quand il n'y a pas de point dans le nom, l'expression lancera une erreur. FindString donnera 0 donc 0-1 dans la SubString externe n'est pas autorisé. La première expression vérifie déjà ceci et assigne @ [User :: t] à 0 quand il n'y a pas de point, à cause de quoi 0-0 ne passera pas par l'erreur.

+0

Top! :) La première déclaration fonctionne parfaitement :) Pour la deuxième déclaration savez-vous comment utiliser la fonction Reverse() dans SSIS? –

+0

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