CREATE TABLE [dbo].[TES_Tracks](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Rate] [float] NULL,
[TOL] [datetime] NOT NULL
)
我想將rate列更改爲decimal(28,6)。我已經在這個表中以浮點格式存在大量的 數據。我害怕任何數據丟失。 我該怎麼去呢?將SQL列從浮點更改爲小數類型
CREATE TABLE [dbo].[TES_Tracks](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Rate] [float] NULL,
[TOL] [datetime] NOT NULL
)
我想將rate列更改爲decimal(28,6)。我已經在這個表中以浮點格式存在大量的 數據。我害怕任何數據丟失。 我該怎麼去呢?將SQL列從浮點更改爲小數類型
您可以簡單地更新率數據,然後更改列數據類型。
首先,你可以通過下面的查詢(僅適用於有小數部分< 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);
這樣,您不需要刪除「費率」列。
未經測試,但他可能是值得一試...
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'
+1這是我正在建議的。 –
謝謝你的回答。但是因爲在其他地方使用了柱速率,所以不能選擇柱速率。因此,您的方法在我的病歷中容易出錯。 – CoderKK
在這種情況下,爲什麼不在使用新(臨時)列重新填充費率後將其更改爲十進制。換句話說,按照bsivel的建議添加RateNew和UPDATE。然後改變表格來改變Lamak建議的數據類型。然後,您可以將Rate與RateNew進行比較,如果列更改導致您不喜歡的舍入問題,則可以從RateNew進行更新。最後,降低RateNew。 – FumblesWithCode
'ALTER TABLE [DBO]。[TES_Tracks] ALTER COLUMN [費用] DECIMAL(28,6)' – Lamak
您可以先查詢,看看是否有通過選擇具有浮點值的行* FROM [dbo]。[TES_Tracks] WHERE [Rate] <0.000001;然後,您可以決定如何處理數據。 –
@lamak會造成任何數據丟失? – CoderKK