SQL会自动舍入值

时间:2014-12-04 12:04:22

标签: sql sql-server sql-server-2008 tsql sql-server-2012

我有两张桌子。第一个表(Table1)用于获取记录,第二个表(Table2)用于将第一个表记录插入其中。但是在得到结果后我有点困惑。

在表1和表2栏中"金额"具有相同的数据类型,即nvarchar(max)

表1

Id   Amount
1    Null
2    -89437.43
2    -533.43
3    22403.88

如果我运行此查询

Insert into Table2(Amount)
Select Amount from Table1

然后得到这样的结果,我不知道为什么值会自动舍入

Table2

Id   Amount
1    Null
2    -89437.4
2    -533.43
3    22403.9

6 个答案:

答案 0 :(得分:3)

在转换回字符串类型时,SQL Server 舍入浮点值 然后你有空字符串的有趣位为0,以及其他奇怪的效果

SELECT CAST(CAST('' AS float) AS nvarchar(MAX))
SELECT CAST(CAST('0.E0' AS float) AS nvarchar(MAX))

使用小数。

如果你需要存储“空白”(这与NULL有何不同?)使用一个单独的位列来允许额外的值

答案 1 :(得分:1)

Here对您的问题有很好的解释。

更明确地给出浮点数或小数或数字(xx,x)(x表示数值)

然后它将转换为数据,否则它将最后一个值四舍五入。

Insert into Table2(Amount)
Select cast(Amount as numeric(18,2) --or  , cast (Amount as float)
from Table1

检查此链接: - TSQL Round up decimal number

答案 2 :(得分:1)

在我的情况下,我正在转换为正确的数据类型,但表中的列有十进制(18,0)。因此,请确保小数位(18,2)正确表示小数位。

答案 3 :(得分:0)

也许您的查询工具会截断为8个字符。

检查实际字段长度以查看问题是否确实存在于数据库中:

SELECT LEN(Amount)
FROM Table2
WHERE Amount LIKE '%-89437.%'

答案 4 :(得分:0)

不可复制。在SQL Server 2012上运行此脚本:

DECLARE @T1 TABLE ([Amount] nvarchar(max) NULL);
DECLARE @T2 TABLE ([Amount] nvarchar(max) NULL);

INSERT INTO @T1 ([Amount])
VALUES (NULL),('-89437.43'),('-533.43'),('22403.88');

Insert into @T2(Amount)
Select Amount from @T1;

SELECT * FROM @T2;

产生此结果:

Amount
NULL
-89437.43
-533.43
22403.88

您描述的问题不存在。

答案 5 :(得分:0)

这将向您显示问题:

DECLARE @T1 TABLE ([Amount123456789] money NULL);
DECLARE @T2 TABLE ([Amount123456789] nvarchar(max) NULL);

INSERT INTO @T1 ([Amount123456789])
VALUES (NULL),('-89437.43123'),('-533.43456'),('22403.88789'),(22403.88789);

Insert into @T2(Amount123456789)
Select Amount123456789 from @T1;

SELECT * FROM @T1;
SELECT * FROM @T2;