Данные столбца форматирования служб SSIS - PullRequest
1 голос
/ 03 марта 2020

Как я могу отформатировать данные столбца в службах SSIS, аналогично MS SQL

SQL: выберите ФОРМАТ (7.326, '00 .0000000 ') КАК «Формат»

Результаты: 07.3260000

Как видите, мне нужно и 0, и трейлинг 0 с 10 символами в длину и 2 перед десятичными "."

Спасибо

М

Ответы [ 2 ]

4 голосов
/ 03 марта 2020

Я сделаю это в четыре шага, чтобы объяснить логику c. Это может быть сделано сразу, и я добавлю это выражение в конце, но это много, чтобы попытаться принять все само по себе. Это кажется большим, потому что это так, но функция FORMAT выполняет много работы, поэтому это такая производительность.

Я использую столбец с именем ColVal (умно, Значение столбца), который я определил как decimal(18,10), чтобы учесть любые числа, которые могут появиться для вас с числом, превышающим ожидаемое число по обе стороны от десятичной точки.

Преобразование типов данных

Во-первых, любое "число" с начальным нулем действительно является символьными данными. Поскольку вы меняете типы данных, вероятно, проще всего добавить в поток данных столбец для результатов этого преобразования.

В этом упражнении я начал с явного преобразования данных, чтобы сделать остальные выражения легче читать. Тогда для шага мы будем использовать ColValChar, но, опять же, мы завершим его в конце.

Слева от десятичной дроби: ведущий ноль (и)

Сначала найдите часть слева.

LeftChar (new column) = LEFT(ColValChar,FINDSTRING(ColValChar,".",1) - 1)

Затем добавьте к ней начальный ноль, если его длина меньше двух символов. В противном случае оставьте это так, как мы его нашли.

PaddedLeft = LEN(LeftChar) < 2 ? RIGHT("00" + LeftChar,2) : LeftChar

Справа от десятичной дроби: завершающие нули

Найдите часть строки справа.

RightChar = RIGHT(ColValChar,LEN(ColValChar) - FINDSTRING(ColValChar,".",1))

Дополните его или, если необходимо, обрежьте до семи.

PaddedRight = LEFT(RightChar + "0000000",7)

Снова соедините Шалтай-Болтай

Затем просто вставьте две строки снова вместе.

SteppedColumn = PaddedLeft + "." + PaddedRight

Когда я сделал это, я использовал несколько промежуточных задач. Это заканчивается Multicast, потому что я просто использовал средства просмотра данных для проверки своей работы.

enter image description here

Делая все в одном большом, Ugly Expression

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

BigUglyColumn = 
(LEN(LEFT((DT_STR, 30, 1252)ColVal,FINDSTRING((DT_STR, 30, 1252)ColVal,".",1) - 1)) < 2 ? 
RIGHT("00" + LEFT((DT_STR, 30, 1252)ColVal,FINDSTRING((DT_STR, 30, 1252)ColVal,".",1) - 1),2) 
: LEFT((DT_STR, 30, 1252)ColVal,FINDSTRING((DT_STR, 30, 1252)ColVal,".",1) - 1)) 
+ "." 
+ LEFT(RIGHT((DT_STR, 30, 1252)ColVal,LEN((DT_STR, 30, 1252)ColVal) - 
FINDSTRING((DT_STR, 30, 1252)ColVal,".",1)) + "0000000",7)

Однако в любом случае будет работать. Вот набор результатов из моей последней программы просмотра данных.

+-------+-------------+----------+-----------+------------+-------------+---------------+---------------+
| ColID |   ColVal    | LeftChar | RightChar | PaddedLeft | PaddedRight | SteppedColumn | BigUglyColumn |
+-------+-------------+----------+-----------+------------+-------------+---------------+---------------+
|     1 |       2.345 |        2 |       345 |         02 |     3450000 |    02.3450000 |    02.3450000 |
|     2 |      12.346 |       12 |       346 |         12 |     3460000 |    12.3460000 |    12.3460000 |
|     3 |     112.347 |      112 |       347 |        112 |     3470000 |   112.3470000 |   112.3470000 |
|     4 |       0.348 |        0 |       348 |         00 |     3480000 |    00.3480000 |    00.3480000 |
|     5 | 3.123456789 |        3 | 123456789 |         03 |     1234567 |    03.1234567 |    03.1234567 |
+-------+-------------+----------+-----------+------------+-------------+---------------+---------------+
0 голосов
/ 05 марта 2020

Похоже на Эри c, ответ очень хороший. Вот решение с использованием компонента сценария:

string[] pieces = Row.n.ToString().Split('.');

Row.padded = ("00" + pieces[0]).Substring(("00" + pieces[0]).Length -2,2) + "."
                 + (pieces[1] + "0000000").Substring(0,7);

Вот взгляд на поток данных:

enter image description here

Я буду добавьте примечание, что нет обработки ошибок для десятичного числа.

...