Question

J'ai un fichier plat source avec des valeurs telles que 24.209991, mais ils doivent se charger sur SQL Server sous forme d'argent de type. Dans le DTS (dont je convertit), cette valeur apparaît comme 24.21. Comment convertir ce champ dans SSIS?

À l'heure actuelle, je change juste le type de DT_STR en DT_CY, et cela donne une erreur d'exécution de la conversion de la conversion des données. La conversion de données pour la colonne "Col003" Returté Valeur d'état 2 et le texte d'état "La valeur n'a pas pu être convertie en raison d'une perte potentielle de données.".

Dois-je utiliser une tâche de conversion de données? Et maintenant quoi?

J'ai également essayé de définir la colonne de sortie source sur dt_numeric, puis je le convertisse en dt_cy, avec le même résultat.

J'ai également essayé d'utiliser des colonnes dérivées, en jetant le champ DT_STR COL003 à (DT_NUMERIC, 10,2) COL003, puis en jetant à (dt_cy) col003_numeric. Cela obtient une erreur de distribution.

Était-ce utile?

La solution

Le fichier plat est par défaut à tous les champs dt_str. Utilisez l'option avancée lors de l'édition de la connexion pour avoir le champ numérique en tant que float (DT_R4). Ensuite, dans l'édition avancée de la source de fichier plat (dans l'onglet Flux de données), définissez cette colonne de sortie sur Money (DT_CY).

Ensuite, le champ se convertira sans conversions supplémentaires. Le problème laissait la définition du fichier source en tant que DT_STR.

Autres conseils

Si vous n'avez pas de conversion de données d'utilisation de valeur nulle et assurez-vous de ne pas avoir de caractère drôle (par exemple, une erreur de production de 200 $ US)

Si vous avez des champs nuls ou vides dans votre champ et que vous utilisez une source de fichier plat, assurez-vous de cocher "Renvoyez la valeur nulle de la source .."

Une autre astuce que j'ai utilisée est quelque chose comme: (taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)). Dans la transformation de la colonne dérivée (vous pouvez simplement remplacer le champ)

Généralement, SSIS ne convertit pas correctement les cordes vides en argent.

Pour une raison quelconque dans mon scénario, le OLE DB Destination réellement a été configuré pour accepter un DT_CY. Cependant, le coulage à ce format (quelle que soit la durée des données d'entrée et de destination, et peu importe les données NULL Quand il est arrivé) a toujours causé le même problème.

Après avoir ajouté des spectateurs de données, je peux conclure que cela a quelque chose à voir avec les paramètres régionaux. Ici au Danemark, nous utilisons des virgules (,) en tant que décimaux délimiteurs et points (.) comme des milliers de délimiteurs, au lieu du contraire.

Cela signifie qu'un grand nombre comme 382,939,291,293.38 serait (après la conversion en DT_CY) ressembler 382.939.291.293,38. Même si je doutais fortement que ce pourrait être le problème, j'ai décidé de faire le opposé de ce que j'avais initialement prévu.

J'ai décidé d'aller aux paramètres avancés de mon OLE DB Destination et changer le DT_CY type de colonne à DT_STR Au lieu. Ensuite, j'ai ajouté un Derived Column transformation, et entra l'expression suivante pour transformer la colonne avant de Les données arriveraient à destination.

REPLACE(SUBSTRING(Price, 2, 18), ",", ".")Price était le nom de la colonne.

À ma grande surprise, cela a résolu le problème, car j'ai compris que mon OLE DB Destination envoyait maintenant les données sous forme de chaîne, ce que le serveur SQL comprenait parfaitement bien.

Je suis certain que c'est un bug! J'utilisais SQL Server 2008, donc cela aurait pu être résolu dans les éditions ultérieures. Cependant, je trouve assez critique qu'une chose aussi essentielle ne fonctionne pas correctement!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top