返回值的格式类似于 if cast as money

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 流程

  • 从数据库中提取
  • 上演
  • 推送到客户端的导入文件

Aar*_*and 5

这真的很难看,希望可以作为一个教训,说明为什么您应该修复接收系统,以免对尾随零如此挑剔。

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)。如果它是一个字符串,您需要在此处对不是数字的值(或者从这个意义上说不是真正的数字)采取一些额外的预防措施。