2014-05-07 44 views
4
CREATE TABLE [dbo].[TES_Tracks](
[Id] [int] IDENTITY(1,1) NOT NULL, 
[Rate] [float] NULL, 
[TOL] [datetime] NOT NULL 
) 

我想將rate列更改爲decimal(28,6)。我已經在這個表中以浮點格式存在大量的 數據。我害怕任何數據丟失。 我該怎麼去呢?將SQL列從浮點更改爲小數類型

+1

'ALTER TABLE [DBO]。[TES_Tracks] ALTER COLUMN [費用] DECIMAL(28,6)' – Lamak

+1

您可以先查詢,看看是否有通過選擇具有浮點值的行* FROM [dbo]。[TES_Tracks] WHERE [Rate] <0.000001;然後,您可以決定如何處理數據。 –

+0

@lamak會造成任何數據丟失? – CoderKK

回答

5

您可以簡單地更新率數據,然後更改列數據類型。

首先,你可以通過下面的查詢(僅適用於有小數部分< 0.000001行)

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

一旦你驗證了CAST表達式是正確的驗證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); 

這樣,您不需要刪除「費率」列。

SQL Fiddle demo

+0

謝謝!這將有助於 – CoderKK

+1

不客氣!很高興幫助:-) –

+0

@JoesephB可能是一個愚蠢的問題,但我不明白你爲什麼在where子句中使用'[Rate] - FLOOR([Rate])''。 – CoderKK

9

未經測試,但他可能是值得一試...

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

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

由於SQL服務器VS浮點處理小數含蓄,這應該讓你行,如果你有數據丟失。

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

然後,如果你滿意......

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

然後重命名RateNew列評定

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

+1這是我正在建議的。 –

+0

謝謝你的回答。但是因爲在其他地方使用了柱速率,所以不能選擇柱速率。因此,您的方法在我的病歷中容易出錯。 – CoderKK

+2

在這種情況下,爲什麼不在使用新(臨時)列重新填充費率後將其更改爲十進制。換句話說,按照bsivel的建議添加RateNew和UPDATE。然後改變表格來改變Lamak建議的數據類型。然後,您可以將Rate與RateNew進行比較,如果列更改導致您不喜歡的舍入問題,則可以從RateNew進行更新。最後,降低RateNew。 – FumblesWithCode

相關問題