2010-10-01 3 views
3

У меня есть поток данных, где есть источник базы данных и место назначения текстового файла (с разделителем по трубе '|'). Источник базы данных собирает SQL-запрос из переменной.Обрезать перед назначением писать в SSIS?

Проблема заключается в том, что если моем размере DB поле, скажем, Firstname и LastName является 30 символов, я получаю результат, как (пространство, представленные точками)

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

Что мне нужно, это поле для обрезаны, так что фактический выход

saurabh|kumar

у меня есть более чем 40 столбцов, чтобы писать, и я не хотел бы, чтобы вручную вставить RTRIM после каждого столбца мой BIG sql query :(

Я должен добавить, что источник может иметь до 50 000 строк. Я думал о размещении компонента сценария между ними, но обработка каждой строки может повлиять на производительность.

Любые идеи?

ответ

9

У вас есть несколько вариантов, но некоторые из них, очевидно, будут нежелательны или невозможны из-за вашей ситуации.

Во-первых, я предполагаю, что конечные пробелы в данных связаны с тем, что для типов данных для исходных столбцов используются CHAR или NCHAR. Вы можете изменить типы данных в исходной базе данных на VARCHAR или NVARCHAR. Это, вероятно, не очень хорошая идея.

Если типы данных в исходных данных являются VARCHAR или NVARCHAR, а конечные пробелы находятся в данных, вы можете обновить данные, чтобы удалить конечные пробелы. Вероятно, это тоже не привлекательно.

Итак, у вас есть SSIS, и лучшее место для обработки это в потоке данных. К сожалению, вы должны разработать решение для каждого столбца с конечными пробелами. Я не думаю, что вы найдете быстрое и простое решение «исправить все столбцы».

Вы можете выполнить обрезку данных с помощью преобразования сценария, но вы должны написать код для выполнения этой работы. Или вы можете использовать компонент преобразования Derived Column. В преобразовании Derived Column вы должны добавить производный столбец для каждого столбца, который нуждается в обрезке. Например, у вас будет столбец firstname и столбец lastname. Полученное значение столбца заменит существующее значение столбца.

В преобразовании Derived Column вы должны использовать синтаксис выражения SSIS для обрезки данных.Firstname и фамилия комплектациях выражения будет

RTRIM(firstname) 
RTRIM(lastname) 

Производительность, вероятно, будет лучше для Derived преобразования столбца, но она не может сильно отличаться от решения сценария. Однако преобразование Derived Column, вероятно, будет легче читать и понимать позже.

+0

Я использовал преобразование Derived Column для этого. – FumblesWithCode

0

Вы можете попробовать использовать компонент сценария в потоке данных? В отличие от потока управления, компонент сценария потока данных имеет входы &.

Посмотрите на этот пример в MSDN: http://msdn.microsoft.com/en-us/library/ms345160.aspx

Если вы можете перебирать каждый столбец строки, как она течет через компонент сценария, вы могли бы сделать .Net дифферент на данных столбца, а затем передать (?) отрегулированный ряд на выходе.

Преимущество там, конечно же, будет урезать будущие строки, которые вы добавите позже.

Просто идея, я не пробовал это сам. Отправляйте сообщение, если оно работает.

+0

У меня может быть до 50 000 строк, около 40 столбцов. Обработка каждого отдельно, хотя компонент скрипта может иметь серьезное влияние на производительность, я думаю:/ –

+0

@Saurabh - Я использовал компонент потока данных сценария для другой задачи, и производительность была хорошей. В этом я взял строку с разделителями и разделил ее на столбцы, а затем отправил каждую строку в выходной буфер. Я бы сказал, что стоит пойти - 50k строк и 40 столбцов не так много, – Meff

Смежные вопросы