CAST数字到varchar给出科学记数法

时间:2017-12-11 18:38:24

标签: casting sql-server-2012 type-conversion concatenation

我有三个字段,我试图连接成一个大字段。其中两个字段是varchar,但其中一个是浮点数。在某些情况下,连接字段显示科学记数法。连接字段应该是varchar并显示三个字段的组合,而不管它们的格式如何。当我只是连接两个varchar字段,当值包含所有数字时,我甚至看到科学记数法。为什么会发生这种情况,我该如何解决?以下是我尝试进行连接的一些示例:

Field1 = e.DocumentNo + e.Assignment + CAST(CAST([Amount in LC] as int) as nvarchar(50))

Field2 = CAST(e.DocumentNo + e.Assignment as varchar(255))

我也尝试过使用CONVERT,它没有提供预期的结果。 DocumentNo是varchar(255),Assignment是varchar(255),但当我分别为5115146916和1610000分别设置这些值时,Field2看起来像5.11515E + 16.

我还尝试将CONCAT()与字段一起使用,它会产生相同的不良结果。

1 个答案:

答案 0 :(得分:1)

你走了:

IF OBJECT_ID('TEMPDB..#ConcatData','U') IS NOT NULL
DROP TABLE #ConcatData;

CREATE TABLE #ConcatData(
[Amount in LC] [float] NULL,
[Assignment] [varchar](255) NULL,
[DocumentNo] [varchar](255) NULL)

INSERT INTO #ConcatData
VALUES
(-27.08, '20120295', '4820110172'),
(10625451.5124, '20140701', '4810122475'),
(205.5, 'TPE035948900001', '8200022827'),
(10000000, 'TPE035948900001', '8200022827')

SELECT DOCUMENTNO + 
       ASSIGNMENT +
       CASE WHEN RIGHT(str([amount in lc],50,4),4) = '0000'
                THEN ltrim(LEFT(str([amount in lc],50,4),LEN(str([amount in lc],50,4))-5))
            WHEN RIGHT(str([amount in lc],50,4),3) = '000'
                THEN ltrim(LEFT(str([amount in lc],50,4),LEN(str([amount in lc],50,4))-3))
            WHEN RIGHT(str([amount in lc],50,4),2) = '00'
                THEN ltrim(LEFT(str([amount in lc],50,4),LEN(str([amount in lc],50,4))-2))
            WHEN RIGHT(str([amount in lc],50,4),1) = '0'
                THEN ltrim(LEFT(str([amount in lc],50,4),LEN(str([amount in lc],50,4))-1))
            ELSE ltrim(str([amount in lc],50,4))
            END
FROM #ConcatData

此处故事的道德,float不是您的列的正确数据类型。我实际上不知道float何时是正确的数据类型...

无论如何,需要使用令人讨厌的CASE语句来删除由STR()引起的多余的小数位零。你甚至可能需要更多,但这最多可以覆盖4位小数,我想你会明白这一点。

一个注意事项,第一个THEN删除了5个字符而不是4个。这也包括.

输出:

482011017220120295-27.08
48101224752014070110625451.5124
8200022827TPE035948900001205.5
8200022827TPE03594890000110000000