2009-07-07 7 views
1

J'ai un fichier csv:numérique 99,99 de fichier plat ne veut pas aller dans un NUMERIC (4,2) 'SQL Server

1|1.25 
2|23.56 
3|58.99 

Je veux mettre cette valeur dans une table SQL Server avec SSIS. J'ai créé ma table:

CREATE TABLE myTable(ID int, Value numeric(4,2)); 

Mon problème est que je dois créer une colonne dérivée Transformation de préciser mon casting:

(DT_NUMERIC,4,2)(REPLACE(Value,".",",")) 

Sinon, SSIS ne semble pas être en mesure de mettre ma valeur dans ma colonne, et remplir ma colonne avec une valeur nulle.

Et je pense qu'il est trop moche de le faire de cette façon. Je veux que ma Transformation de colonne dérivée soit ici pour une vraie nouvelle colonne dérivée, et pas pour une simple distribution que SSIS doit détecter.

Alors, quelle est la manière standard d'utiliser SSIS pour résoudre ce problème? Pouvez-vous modifier votre colonne source SSIS pour être dans le type de données correct?

+0

FWIW, je pense que vous avez déjà la meilleure solution.Les paramètres régionaux de votre machine utilisent une virgule et le fichier utilise la période. Les valeurs du fichier doivent donc être modifiées pour correspondre au paramètre de région. – onupdatecascade

Répondre

0

Vous chargez ceci au format international (56,99 au lieu de 56,99). Vous devez charger cela comme 56.99 pour que SQL Server le reconnaisse comme tel. Sortez le REPLACE(Value, ".", ",") et ont juste le code soit:

(DT_NUMERIC,4,2)(Value)

Manipulez la mise en forme du côté de l'application, pas du côté des données. La virgule est un opérateur réservé dans SQL Server et vous ne pouvez pas modifier ce fait.

+0

Ne fonctionne pas, ma colonne est toujours remplie avec des valeurs nulles –

+0

Vous avez besoin d'un visualiseur de données dans la tâche Flux de données, puis, pour voir ce qui se passe dans et hors de la tâche Colonne dérivée ... – Eric

-1

+0

J'ai essayé de définir ma colonne source dans le type de données correct, mais tout est vert, mais ma colonne est nul partout. Donc, je définis dans la chaîne (50) à la place, créer une nouvelle colonne dérivée, ma distribution, et il s'exécute. –

+0

Le fait que vous faites un remplacement de. avec, suggère que votre machine a des paramètres européens ou similaires, et nécessite donc que les données soient au format 56,78 plutôt que 56,78. Si vous pouvez changer les paramètres régionaux, cela fonctionnera, sinon vous devrez le faire de cette façon. Faire cela n'est pas une mauvaise pratique non plus, SSIS force beaucoup de colonnes dérivées pour des actions simples. – cjk

+0

Je ne changerai pas mes paramètres régionaux. Allons, je suis en France;) Mais si vous ne pensez pas que c'est trop moche, je peux changer d'avis là-dessus. C'est plus simple ^^ –

-1

Si vous avez le contrôle sur la production de votre fichier, je vous suggère aux valeurs de format sans QUELQUE décimale ou mille séparation: dans ce cas I'ld ont un fichier avec des valeurs:

1|125 
2|2356 
3|5899 

puis appliquez une division de 100 lors de l'importation des données. Bien qu'il ait l'avantage d'être indépendant de la culture, il présente bien entendu quelques inconvénients:
1) Tout d'abord, il ne sera peut-être pas possible d'imposer ce format de fichier.
2) Il présume que toutes les valeurs numériques sont formatées en conséquence, dans ce cas chaque valeur est multipliée par 100; Cela peut poser un problème si vous devez mélanger des valeurs de pays avec des positions décimales différentes (beaucoup ont deux décimales, mais certaines ont des décimales nulles).
3) Cela peut avoir un impact important sur d'autres routines, peut-être hors de votre contrôle.
Par conséquent, cela peut vraiment être une option si vous avez un contrôle total sur le fichier csv.

0

N'avez pas beaucoup utilisé SSIS, mais vous ne pouvez pas définir les paramètres régionaux sur la source de fichier ou au moins définir le séparateur décimal?

1
BULK 
INSERT myTable 
FROM 'c:\csvtest1.txt' 
WITH 
(
FIELDTERMINATOR = '|', 
ROWTERMINATOR = '\n' 
) 

csvtest1.txt

1|1.25 
2|23.56 
3|58.99 
Questions connexes