【发布时间】:2014-10-08 00:19:13
【问题描述】:
我正在尝试将表从远程 SQL 2000 数据库复制到我的本地 SQL 2012 实例中。
作为检查已更改值的快速方法,我使用了Simple Talk 上的“UNION ALL...GROUP BY”技术(向下滚动大约一半)。
不幸的是,远程数据类型设置为 REAL,因为这是一个近似数据类型,所以它不是很可靠,因为它会在我不希望的地方找到差异(即使这些差异在计算上存在)。
我尝试使用 CONVERT 将值更改为 NUMERIC(精确)数据类型。但是,不同的列具有不同的小数位数,因此很难找到一种万能的解决方案。
我注意到的一件事是,如果我运行以下查询(TimeID 是 INT,Value1 是 REAL):
SELECT [TimeID], [Value1], CONVERT(DECIMAL(19,10), [Value1]) AS [CONV19,10], CONVERT(DECIMAL(19,3), [Value1]) AS [CONV19,3], CONVERT(DECIMAL(19,4), [Value1]) AS [CONV19,4]
FROM [DATABASE].[SCHEMA].[TABLE]
WHERE [TimeID] = 12345
我得到以下结果:
[TimeID] [Value1] [CONV19,10] [CONV19,3] [CONV19,4]
12345 1126.089 1126.0885009766 1126.089 1126.0885
请注意,SQL Server Management Studio 将 Value1 显示为原始格式时保留 3 位小数(即无需我进行转换)。
所以我的问题是:SSMS 怎么知道它应该显示到小数点后 3 位?它怎么知道 1126.0885 不是实际存储的数字,而是 1126.089?
理想情况下,我想了解它的算法,以便我可以复制它以将我的数据转换为正确的小数位数。
【问题讨论】:
标签: sql sql-server formatting