2010-05-19 35 views
8

J'ai un package 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 affiche les résultats de la requête dans un fichier plat (j'ai également essayé de tirer le table entière et n'utilisant pas une sélection SQL). Le problème est que la source de données tire une colonne qui est un type de données Money, et si la valeur n'est pas zéro, elle vient juste dans le fichier plat du texte (comme '123.45'), mais quand la valeur est nulle , il apparaît dans le fichier plat de destination comme '.00'. Je dois savoir comment remettre le zéro initial dans le fichier plat.Comment obtenir le flux de données SSIS pour mettre '0.00' dans un fichier plat?

J'ai essayé différents 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'avoir aucun effet.

J'ai essayé une déclaration de cas dans ma sélection, comme ceci:

CASE WHEN columnValue = 0 THEN 
    '0.00' 
    ELSE 
     columnValue 
    END 

(résultats encore » .00')

J'ai essayé des variations sur ce comme ceci:

CASE WHEN columnValue = 0 THEN 
    convert(decimal(12,2), '0.00') 
ELSE 
    convert(decimal(12,2), columnValue) 
END 

(résultats Toujours dans » .00')

et:

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

(résultats dans » 0,0000000000000000000 ')

Cette petite question idiote est Killin' moi. Quelqu'un peut-il me dire comment obtenir une valeur de base de données de type de données zéro Money dans un fichier plat comme «0.00»?

+0

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

Répondre

9

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

+0

C'est une bonne idée! Laisse-moi essayer ça ... – theog

+0

Okay, après un peu de catch (pour convertir un numérique en string), ça a marché. Merci Soo! – theog

8

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 Data Flow Transform). J'ai ajouté la colonne dérivée comme une nouvelle colonne de type de données Unicode String ([DT_WSTR]), et utilisé l'expression suivante:

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

J'espère que ça aide!

+0

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

1

Depuis que vous exportez en fichier texte, il suffit d'exporter les données préformatées.

Vous pouvez le faire dans la requête ou créer une colonne dérivée, quoi que vous soyez plus à l'aise. J'ai choisi de faire la largeur de la colonne 15 caractères. Si vous importez dans un système qui attend des nombres, ces zéros doivent être ignorés ... alors pourquoi ne pas standardiser la longueur du champ?

Une solution simple dans SQL est la suivante:

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 

vous suffit de remplacer '0,00' avec le nom de la colonne et ne pas oublier d'ajouter le FROM table_name, etc ..

2

j'ai utilisé l'éditeur avancé pour modifier la colonne double-precision float-decimal puis définissez le Scale 2:

enter image description here