将SQL列从Float更改为Decimal Type

Cod*_*rKK 6 sql t-sql sql-server

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

我想将rate列更改为十进制(28,6).我已经在浮动格式的表中有很多数据.我害怕任何数据丢失.我应该怎么做?

bsi*_*vel 10

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

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

UPDATE [dbo].[TES_Tracks] set RateNew = Cast(Rate as Decimal(28,6));
Run Code Online (Sandbox Code Playgroud)

由于sql server隐式处理十进制vs浮点数,如果你有数据丢失,这应该得到行.

Select * From [dbo].[TES_Tracks] where Rate <> RateNew;
Run Code Online (Sandbox Code Playgroud)

如果你满意的话......

ALTER TABLE [dbo].[TES_Tracks] DROP COLUMN [Rate];
Run Code Online (Sandbox Code Playgroud)

然后将RateNew列重命名为Rate

EXEC sp_RENAME 'TES_Tracks.RateNew' , 'Rate', 'COLUMN'
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,为什么在将其更改为十进制后不使用新的(临时)列重新填充Rate.换句话说,添加RateNew和UPDATE作为bsivel建议.然后ALTER表以Lamak建议的方式更改数据类型.然后,如果列更改导致您不喜欢任何舍入问题,则可以将Rate与RateNew进行比较并从RateNew更新.最后,放下RateNew. (2认同)

Jos*_*h B 8

您只需更新Rate数据,然后更改列数据类型即可.

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

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

一旦验证了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);
Run Code Online (Sandbox Code Playgroud)

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

SQL Fiddle demo