【发布时间】:2020-06-16 00:39:54
【问题描述】:
如何在 SSIS 中格式化列数据,类似于 MSSQL
SQL:选择 FORMAT(7.326, '00.0000000') AS 'Format'
结果:07.3260000
如您所见,我需要前导 0 和尾随 0,长度为 10 个字符,小数点前为 2“。”
谢谢,
M
【问题讨论】:
-
源数据列是小数吗?还是什么格式?
标签: sql-server tsql ssis
如何在 SSIS 中格式化列数据,类似于 MSSQL
SQL:选择 FORMAT(7.326, '00.0000000') AS 'Format'
结果:07.3260000
如您所见,我需要前导 0 和尾随 0,长度为 10 个字符,小数点前为 2“。”
谢谢,
M
【问题讨论】:
标签: sql-server tsql ssis
我将分四个步骤来解释逻辑。它可以一次完成,我将在最后添加该表达式,但是要尝试单独完成所有内容会很多。这似乎很多,因为它确实如此,但 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 结尾,因为我只是使用数据查看器来检查我的工作。
用一个又大又丑的表情做这一切
出于我不总是理解的原因,人们似乎喜欢在 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 |
+-------+-------------+----------+-----------+------------+-------------+---------------+---------------+
【讨论】: