2010-10-01 5 views
3

J'ai un flux de données, où il y a une source DB et une destination de fichier texte plat (délimité par le tube '|'). La source DB extrait la requête SQL d'une variable.Couper avant la destination écrire dans SSIS?

Le problème est que si ma taille de champ DB de dire, prenom et nom sont 30 caractères, je reçois la sortie comme (l'espace représenté par des points)

saurabh......................|kumar.......................

Ce que je besoin est les champs à coupé, de sorte que la sortie réelle est

saurabh|kumar

J'ai plus de 40 colonnes pour écrire, et je ne voudrais pas insérer manuellement RTRIM après chaque colonne ma requête BIG sql :(

Je devrais ajouter que la source peut avoir jusqu'à 50 000 lignes retournées. Je pensais mettre un composant de script entre les deux, mais le traitement de chaque ligne peut avoir un impact sur les performances.

Des idées?

Répondre

9

Vous avez pas mal d'options, mais certaines seront évidemment indésirables ou impossibles à faire à cause de votre situation. Tout d'abord, je suppose que les espaces de fin dans les données sont parce que les types de données pour les colonnes source sont CHAR ou NCHAR. Vous pouvez modifier les types de données dans la base de données source vers VARCHAR ou NVARCHAR. Ce n'est probablement pas une bonne idée.

Si les types de données dans les données source sont VARCHAR ou NVARCHAR et que les espaces de fin figurent dans les données, vous pouvez mettre à jour les données pour supprimer les espaces de fin. Ce n'est probablement pas attrayant non plus. Donc, vous avez SSIS et le meilleur endroit pour gérer cela est dans le flux de données. Malheureusement, vous devez développer une solution pour chaque colonne contenant les espaces de fin. Je ne pense pas que vous trouverez une solution simple et rapide pour "réparer toutes les colonnes".

Vous pouvez effectuer le découpage de données avec une transformation de script, mais vous devez écrire le code pour effectuer le travail. Ou, vous pouvez utiliser un composant de transformation Derived Column. Dans la transformation Colonne dérivée, vous devez ajouter une colonne dérivée pour chaque colonne à ajuster. Par exemple, vous auriez une colonne prénom et une colonne nom de famille. La valeur de colonne dérivée remplacerait la valeur de colonne existante.

Dans la transformation de colonne dérivée, vous devez utiliser la syntaxe d'expression SSIS pour découper les données.Le prenom et les expressions de finition lastname seraient

RTRIM(firstname) 
RTRIM(lastname) 

Performance sera probablement meilleur pour la transformation de colonne dérivée, mais il ne peut pas différer beaucoup de la solution de script. Cependant, la transformation de la colonne dérivée sera probablement plus facile à lire et à comprendre plus tard.

+0

J'ai utilisé la transformation de colonne dérivée pour cela. – FumblesWithCode

0

Vous pourriez essayer d'utiliser un composant de script dans le flux de données? Contrairement au flux de contrôle, un composant de script de flux de données a des entrées & sorties.

Regardez cet exemple dans MSDN: http://msdn.microsoft.com/en-us/library/ms345160.aspx

Si vous pouvez itérer chaque colonne de la ligne telle qu'elle circule à travers le composant de script, vous pouvez faire une garniture .Net sur les données de la colonne, puis passez (?) la ligne découpée à la sortie. L'avantage là-bas, bien sûr, est qu'il va couper les futures lignes que vous ajouterez plus tard.

Juste une idée, je n'ai pas essayé moi-même. Revenez si cela fonctionne.

+0

Je pourrais avoir jusqu'à 50 000 lignes, avec environ 40 colonnes. Le traitement individuel de chaque composant de script peut avoir un sérieux impact sur les performances, je suppose:/ –

+0

@Saurabh - J'ai utilisé un composant de flux de données de script pour une tâche différente, et les performances étaient bonnes. Dans celui-là, j'ai pris une chaîne délimitée et l'ai divisée en colonnes, puis ai envoyé chaque rangée au tampon de sortie. Je dirais que ça vaut le coup - 50k lignes et 40 colonnes ne sont pas beaucoup, – Meff

Questions connexes