2012-05-18 58 views
10

我有一列,我認爲它已被錯誤地聲明。它包含數據,我不希望丟失數據。使用數據修改列類型而不刪除數據

我希望改變從varchar(最大)的定義爲varchar(一個整數)。我在印象之下,我不能只改變列類型?

是創建臨時列「column2」,將數據從具有問題類型的列轉移到此列的最佳方法,刪除問題列,然後將temp列重命名爲原始問題列?

如果是這樣,我怎麼從問題列中的值複製到新列?

編輯:對於任何人有同樣的問題,你可以只使用ALTER語句。

回答

16

只要數據類型是有點「相關」 - 是的,你完全可以做到這一點。

您可以將INT更改爲BIGINT - 第二種類型的值範圍較大,因此您沒有「丟失」任何數據的危險。

您可以將VARCHAR(50)更改爲VARCHAR(200) - 同樣,類型是兼容的,尺寸越來越大 - 沒有截斷任何內容的風險。

基本上,你只需要

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 

或什麼的。只要你沒有超過200個字符的字符串,你就會好起來的。不知道如果您確實有更長的字符串會發生什麼 - 要麼轉換將失敗並出現錯誤,要麼會繼續並告訴您某些數據可能已被截斷。所以,我建議你先試試這個在複製數據的 :-)

它變得有點棘手,如果你需要一個VARCHAR更改爲INT或類似的東西 - 很顯然,如果你有列值是不適合新類型,轉換將失敗。但即使使用單獨的「臨時」新列也不能解決這個問題 - 您需要以某種方式處理這些「不兼容」的情況(忽略它們,將NULL留在那裏,將它們設置爲默認值 - 某種東西)。

此外,VARCHARNVARCHAR之間的轉換可能很麻煩,如果你有例如非西歐字符 - 轉換時可能會丟失某些條目,因爲它們無法用其他格式表示,或者從一種類型到另一種類型的「默認」轉換不能按預期工作。

+1

適用於'CHAR'到'VARCHAR',甚至修剪填充。 –

+0

我無法從VARCHAR更改爲TEXT,有什麼想法? – Murilo

+1

@Murilo:由於'TEXT'已經被**棄用**,並且很快就會被刪除,所以我會**不會**修改列*到*數據類型'TEXT' - 而是使用'VARCHAR(MAX)'if您真的需要超過8000個字符的數據 –

0

添加具有類型爲varchar(NN)的臨時列2,運行update tbl set column2 = column,檢查是否有任何錯誤發生;如果一切正常,請更改原始列,將數據複製回來並刪除第2列。

1

計算最大數據長度存儲INT該表的該列。

Select max(len(fieldname)) from tablename 

現在您可以減小該列的大小,直到在先前的查詢中得到結果。

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 
+0

如果您首先查看錶的SCHEMA,是否需要第一步? –

+0

你想減少一個varchar字段,所以這應該是第一步。 –

+1

我很抱歉。我誤解並認爲他正在擴張,而不是縮小。 –