【问题标题】:SSIS Formatting Column DataSSIS 格式化列数据
【发布时间】: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


【解决方案1】:

我将分四个步骤来解释逻辑。它可以一次完成,我将在最后添加该表达式,但是要尝试单独完成所有内容会很多。这似乎很多,因为它确实如此,但 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 |
+-------+-------------+----------+-----------+------------+-------------+---------------+---------------+

【讨论】:

    【解决方案2】:

    与 Eric 类似,哪个答案非常好。这是使用脚本组件的解决方案:

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

    下面看一下数据流:

    我会补充一点,没有小数的错误处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多