我有一列,我認爲它已被錯誤地聲明。它包含數據,我不希望丟失數據。使用數據修改列類型而不刪除數據
我希望改變從varchar(最大)的定義爲varchar(一個整數)。我在印象之下,我不能只改變列類型?
是創建臨時列「column2」,將數據從具有問題類型的列轉移到此列的最佳方法,刪除問題列,然後將temp列重命名爲原始問題列?
如果是這樣,我怎麼從問題列中的值複製到新列?
編輯:對於任何人有同樣的問題,你可以只使用ALTER語句。
我有一列,我認爲它已被錯誤地聲明。它包含數據,我不希望丟失數據。使用數據修改列類型而不刪除數據
我希望改變從varchar(最大)的定義爲varchar(一個整數)。我在印象之下,我不能只改變列類型?
是創建臨時列「column2」,將數據從具有問題類型的列轉移到此列的最佳方法,刪除問題列,然後將temp列重命名爲原始問題列?
如果是這樣,我怎麼從問題列中的值複製到新列?
編輯:對於任何人有同樣的問題,你可以只使用ALTER語句。
只要數據類型是有點「相關」 - 是的,你完全可以做到這一點。
您可以將INT
更改爲BIGINT
- 第二種類型的值範圍較大,因此您沒有「丟失」任何數據的危險。
您可以將VARCHAR(50)
更改爲VARCHAR(200)
- 同樣,類型是兼容的,尺寸越來越大 - 沒有截斷任何內容的風險。
基本上,你只需要
ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL
或什麼的。只要你沒有超過200個字符的字符串,你就會好起來的。不知道如果您確實有更長的字符串會發生什麼 - 要麼轉換將失敗並出現錯誤,要麼會繼續並告訴您某些數據可能已被截斷。所以,我建議你先試試這個在複製數據的 :-)
它變得有點棘手,如果你需要一個VARCHAR
更改爲INT
或類似的東西 - 很顯然,如果你有列值是不適合新類型,轉換將失敗。但即使使用單獨的「臨時」新列也不能解決這個問題 - 您需要以某種方式處理這些「不兼容」的情況(忽略它們,將NULL留在那裏,將它們設置爲默認值 - 某種東西)。
此外,VARCHAR
和NVARCHAR
之間的轉換可能很麻煩,如果你有例如非西歐字符 - 轉換時可能會丟失某些條目,因爲它們無法用其他格式表示,或者從一種類型到另一種類型的「默認」轉換不能按預期工作。
添加具有類型爲varchar(NN)的臨時列2,運行update tbl set column2 = column
,檢查是否有任何錯誤發生;如果一切正常,請更改原始列,將數據複製回來並刪除第2列。
計算最大數據長度存儲INT該表的該列。
Select max(len(fieldname)) from tablename
現在您可以減小該列的大小,直到在先前的查詢中得到結果。
ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL
如果您首先查看錶的SCHEMA,是否需要第一步? –
你想減少一個varchar字段,所以這應該是第一步。 –
我很抱歉。我誤解並認爲他正在擴張,而不是縮小。 –
適用於'CHAR'到'VARCHAR',甚至修剪填充。 –
我無法從VARCHAR更改爲TEXT,有什麼想法? – Murilo
@Murilo:由於'TEXT'已經被**棄用**,並且很快就會被刪除,所以我會**不會**修改列*到*數據類型'TEXT' - 而是使用'VARCHAR(MAX)'if您真的需要超過8000個字符的數據 –