Я сделаю это в четыре шага, чтобы объяснить логику 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
, потому что я просто использовал средства просмотра данных для проверки своей работы.
Делая все в одном большом, 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 |
+-------+-------------+----------+-----------+------------+-------------+---------------+---------------+