在表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
答案 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;