CREATE TABLE [dbo].[TES_Tracks](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Rate] [float] NULL,
[TOL] [datetime] NOT NULL
)
我想将费率列更改为十进制(28,6)。我已经有很多了 此表中的数据采用浮点格式。我害怕任何数据丢失。 我该怎么做?
答案 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列。