SSIS comment convertir une chaîne de caractères (DT_STR) à argent (DT_CY) lorsque la source dispose de plus de 2 décimales
J'ai une source de fichier plat avec des valeurs telles que 24.209991, mais ils ont besoin de la charge pour SQL Server en tant que type de l'argent. Dans le DTS (dont je suis la conversion à partir d'), que la valeur vient à travers comme 24.21. Comment puis-je convertir ce champ dans SSIS?
Maintenant, je suis simplement en changeant le type de DT_STR à DT_CY, et il donne un terme d'erreur de Données conversion a échoué. La conversion des données de la colonne "Col003" renvoyé la valeur d'état 2 et le statut du texte "La valeur n'a pas pu être converti en raison d'un risque de perte de données.".'
Dois-je utiliser une Conversion de Données de la tâche? Et puis quoi?
J'ai aussi essayé la définition de la source de sortie de la colonne à DT_NUMERIC, et ensuite de les convertir à DT_CY, avec le même résultat.
J'ai aussi essayé d'utiliser des Colonnes Dérivées, coulée dans le DT_STR champ Col003 à (DT_NUMERIC,10,2)Col003 puis de casting que de (DT_CY)Col003_Numeric. Où il y a une erreur de casting.
- Êtes-vous à l'aide d'un ADO.NET destination? J'ai juste essayé avec une destination OLE DB et pas eu de problèmes.
- Source de Fichier plat, destination OLE DB. Pas de problèmes, hein? Ce que je fais mal?!
Vous devez vous connecter pour publier un commentaire.
Le plat de fichier par défaut pour tous les champs DT_STR. Utiliser l'option Avancé sur la modification de la connexion pour avoir le champ numérique en tant que float (DT_R4). Puis, dans l'édition avancée de la Source de Fichier Plat (sur l'onglet Flux de Données), jeu de sortie de la colonne à l'argent (DT_CY).
Ensuite, le champ de convertir sans des conversions supplémentaires. La question était de quitter la source du fichier de définition de DT_STR.
Si vous n'avez pas de valeur null utilisation de la Conversion de Données, et assurez-vous que vous n'avez pas tout drôle de personnage (par exemple: US$200 produire d'erreur)
Si vous avez null ou vide les champs dans votre domaine et que vous utilisez la source de fichier Plat, assurez-vous que vous cochez la case "Renvoyer la valeur null à partir de la source.."
Une autre astuce que j'ai utilisée est quelque chose comme:
(taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)).
dans la Colonne Dérivée de la transformation (que vous pouvez remplacer le champ)Généralement SSIS ne pas convertir les chaînes vides de l'argent correctement.
Pour quelque raison dans mon scénario, le
OLE DB Destination
fait était configuré pour accepter unDT_CY
. Cependant, le casting de ce format (peu importe la longueur de l'entrée et de la destination des données, et peu importe si ou non les données ont étéNULL
quand il est arrivé) toujours le même problème.Après l'ajout de données de téléspectateurs, je peux en conclure que cela a quelque chose à faire avec les paramètres régionaux. Ici, au Danemark, nous utilisons des virgules (
,
) comme séparateur décimal séparateurs et des points (.
), alors que des milliers-des délimiteurs, au lieu de l'inverse.Cela signifie qu'un grand nombre comme
382,939,291,293.38
serait (après la conversion àDT_CY
) ressemblent à382.939.291.293,38
. Même si je doutais fortement qu'il pourrait être le problème, j'ai décidé de faire le en face de 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 modifier leDT_CY
le type de la colonne deDT_STR
à la place. Ensuite, j'ai ajouté unDerived Column
transformation, et entra dans l'expression suivante pour transformer la colonne avant les données arrivent à destination.REPLACE(SUBSTRING(Price, 2, 18), ",", ".")
oùPrice
a été la colonne nom.À ma grande surprise, cela a résolu le problème, car j'ai compris que mon
OLE DB Destination
était maintenant en envoyant les données sous forme de chaîne de caractères, qui le SQL Server compris parfaitement bien.Je suis certain que c'est un bug! J'ai été à l'aide de SQL Server 2008, il aurait pu être résolu dans les éditions ultérieures. Cependant, je trouve ça tout à fait essentiel qu'une telle chose ne fonctionne pas correctement!