将SQL列从Float更改为Decimal Type

时间:2014-05-07 20:35:33

标签: sql sql-server tsql

CREATE TABLE [dbo].[TES_Tracks](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Rate] [float] NULL,
[TOL] [datetime] NOT NULL
)

我想将费率列更改为十进制(28,6)。我已经有很多了 此表中的数据采用浮点格式。我害怕任何数据丢失。 我该怎么做?

2 个答案:

答案 0 :(得分:9)

未经测试,但他可能值得一试......

ALTER TABLE [dbo].[TES_Tracks] ADD [RateNew] DECIMAL(28,6);

UPDATE [dbo].[TES_Tracks] set RateNew = Cast(Rate as Decimal(28,6));

因为sql server隐式处理decimal和float,所以如果你有数据丢失,这应该可以获得行。

Select * From [dbo].[TES_Tracks] where Rate <> RateNew;

然后,如果你满意......

ALTER TABLE [dbo].[TES_Tracks] DROP COLUMN [Rate];

然后将RateNew列重命名为Rate

EXEC sp_RENAME 'TES_Tracks.RateNew' , 'Rate', 'COLUMN'

答案 1 :(得分:7)

您只需更新费率数据,然后更改列数据类型。

首先,您可以使用以下查询验证CAST(仅适用于具有小数部分&lt; 0.000001的行)

SELECT 
  [Rate],
  CAST([Rate] as decimal(28, 6)) Rate_decimal
FROM [dbo].[TES_Tracks]
WHERE [Rate] - FLOOR([Rate]) < 0.000001;

验证CAST表达式是否正确后,可以使用UPDATE语句应用它。同样,您只能更新那些[Rate] - FLOOR([Rate])的行,从而获得良好的性能。

UPDATE [dbo].[TES_Tracks]
SET [Rate] = CAST([Rate] as decimal(28, 6))
WHERE [Rate] - FLOOR([Rate]) < 0.000001;

ALTER TABLE [dbo].[TES_Tracks] ALTER COLUMN [Rate] DECIMAL(28,6);

这样,您就不需要删除Rate列。

SQL Fiddle demo