skm*_*asq 1 ssis sql-server-2008-r2
我客户的系统非常过时,我对此无能为力。我想要实现的是提取值总是至少有 2 个小数位。
例如
从
1826.5695600000
1826.3000000000
34.2300000000
0.0030000000
Run Code Online (Sandbox Code Playgroud)
到
1826.56956
1826.30
34.23
0.003
Run Code Online (Sandbox Code Playgroud)
如果我将这些值转换为money小数点后第 4 位后丢失所有内容,但我需要实现类似但最少 2 位最多 10 位小数的结果。最后是否是字符串并不重要,重要的是我可以以这种格式提取值。
我的第一次尝试是转换为浮点数,找到小数点并相应地将值转换为小数(20,变量),但这是不可能的,所以我现在陷入了如何实现这一目标的想法。
这些值正在通过 SSIS 流程
这真的很难看,希望可以作为一个教训,说明为什么您应该修复接收系统,以免对尾随零如此挑剔。
DECLARE @t TABLE(a DECIMAL(20,10));
INSERT @t VALUES
(1826.5695600000),
(1826.3000000000),
( 34.2300000000),
( 0.0030000000);
DECLARE @d INT = 10; -- number of decimal places in source data!
;WITH s(a,dot,nz) AS
(
SELECT
CONVERT(VARCHAR(32),a),
PATINDEX('%.%',CONVERT(VARCHAR(32),a)),
PATINDEX('%[^0]%',REVERSE(a))
FROM @t
)
SELECT LEFT(a,dot)+SUBSTRING(a,dot+1,@d+1-nz)
+ COALESCE(REPLICATE('0',nz-(@d-1)),'')
FROM s;
Run Code Online (Sandbox Code Playgroud)
结果:
DECLARE @t TABLE(a DECIMAL(20,10));
INSERT @t VALUES
(1826.5695600000),
(1826.3000000000),
( 34.2300000000),
( 0.0030000000);
DECLARE @d INT = 10; -- number of decimal places in source data!
;WITH s(a,dot,nz) AS
(
SELECT
CONVERT(VARCHAR(32),a),
PATINDEX('%.%',CONVERT(VARCHAR(32),a)),
PATINDEX('%[^0]%',REVERSE(a))
FROM @t
)
SELECT LEFT(a,dot)+SUBSTRING(a,dot+1,@d+1-nz)
+ COALESCE(REPLICATE('0',nz-(@d-1)),'')
FROM s;
Run Code Online (Sandbox Code Playgroud)
这假设源数据类型是小数(某物,10)。如果它是一个字符串,您需要在此处对不是数字的值(或者从这个意义上说不是真正的数字)采取一些额外的预防措施。
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |