10
votes

Comment obtenir le flux de données SSIS pour mettre "0.00" dans un fichier plat?

J'ai un paquet SSIS avec un flux de données qui prend une source de données ADO.NET (juste une petite table), exécute une requête SELECT * et génère les résultats de la requête dans un fichier plat (j'ai aussi essayé simplement de tirer Toute la table et non à l'aide d'un SQL Select).

Le problème est que la source de données tire une colonne un type de données d'argent, et si la valeur n'est pas zéro, il s'agit du fichier plat de texte juste bien (comme ' 123.45 '), mais lorsque la valeur est nulle, elle apparaît dans le fichier plat de destination comme ".00". J'ai besoin de savoir comment récupérer le premier zéro dans le fichier plat. P>

J'ai essayé divers types de données pour la sortie (dans le gestionnaire de connexion de fichier plat), y compris la devise et la chaîne, mais cela semble n'ont aucun effet. p>

J'ai essayé une instruction de cas dans mon sélection, comme ceci: p> xxx pré>

(Résultats toujours dans ".00")

J'ai essayé des variations sur cela comme ceci: p> xxx pré>

(entraîne toujours ".00") p>



/ P>

 CASE WHEN columnValue = 0 THEN
     convert(money, '0.00') 
 ELSE 
     convert(money, columnValue) 
 END


1 commentaires

J'aimerais connaître la cause de ce problème - je ne suis pas vraiment à l'aise avec la colonne dérivée.


5 Réponses :


9
votes

Pourriez-vous utiliser une colonne dérivée pour modifier le format de la valeur? Avez-vous essayé ça?


1 commentaires

Ok, après un peu de lutte (pour convertir une chaîne numérique), cela a fonctionné. Merci soo!



11
votes

J'avais exactement le même problème, et la réponse de Soo a fonctionné pour moi. J'ai envoyé mes données dans une transformation de colonne dérivée (dans la boîte à outils de transformation du flux de données). J'ai ajouté la colonne dérivée sous la forme d'une nouvelle colonne de type de données String Unicode ([dt_wstr]) et a utilisé l'expression suivante:

prix <1? "0" + (dt_wstr, 6) Prix: (dt_wstr, 6) Prix

J'espère que cela aide!


2 commentaires

Merci user346389 ... L'inclusion de la syntaxe d'expression de colonne dérivée SSIS bizarre a été utile.


Juste attention aux nombres négatifs. -0.25 convient à -25 à partir de numérique à dt_wstr . Vous pouvez utiliser quelque chose de similaire à [prix] <1? ([Prix]> = 0? "0" + (dt_wstr, 18) [Prix]: [Prix]> -1? "-0" + (dt_wstr, 18) (- - 1 * [Prix]): (DT_WSTR, 18) [Prix]): (dt_wstr, 18) [Price]



1
votes

Étant donné que vous exportez vers un fichier texte, il suffit d'exporter des données préformatées.

Vous pouvez le faire dans la requête ou créer une colonne dérivée, tout ce que vous êtes plus à l'aise. P>

J'ai choisi de faire la colonne 15 caractères large. Si vous importez dans un système qui s'attend à ce qui s'attend à des numéros, ces zéros doivent être ignorés ... alors pourquoi ne pas simplement normaliser la longueur de champ? P>

Une solution simple en SQL est la suivante: P>

    select 
    cast(0.00 as money) as col1
    ,cast(0.00 as numeric(18,2)) as col2 
    ,right('000000000000000' + cast( 0.00 as varchar(10)), 15) as col3
    go

 col1                  col2                 col3
 --------------------- -------------------- ---------------
                 .0000                  .00 000000000000.00


0 commentaires

4
votes

J'ai utilisé l'éditeur avancé pour modifier la colonne de float de double précision à décimal , puis réglez la balance sur 2:

Entrez la description de l'image ici


1 commentaires

Les zéros de la section de l'échelle de la décimale sont tronqués avec cette approche



0
votes

Il est bon d'utiliser une colonne dérivée et de vérifier la condition aussi bien
pricecheck <= 0? "0" + (dt_wstr, 10) PriceCheck: (dt_wstr, 10) PriceCheck

ou alternative est d'utiliser le script VB

 Entrez la description de l'image ici

 Entrez la description de l'image ici


0 commentaires