Schema異動,將資料表欄位型態由 text 變更至 ntext
由於一個廠商開發的系統在資料表規劃時,將會存放unicode的欄位規劃成text而不是ntext。
以至於後來使用上發生問題(很多特殊字會變成亂碼)。為了解決這個問題勢必要將text型態改
為ntext,在異動資料欄位型態過程中遇到一些小問題,在此筆記一下。
步驟一 : 如下圖紅色圈選處,有兩個欄位型態是text。
步驟二 : 如果使用UI來改的話,基本上SQL就是會針對新的Schema新建一個TABLE(如下圖),
然後將原先的資料倒入新資料表後再將新資料表ReName。耳聞一些前輩表示這樣的作法有
可能會讓資料庫Crush,所以也不建議大家用UI來改型態。
步驟三 : 不建議用UI改,那我們就用老方法吧 ! 直接下SQL語法來改。很直覺的寫好語法去執行
卻發生錯誤(如下圖)。系統顯示無法改變資料行的資料類型為ntext。經過測試,我可以用語法將
text改成nvarchar(max)或varchar(max)也可以反向將nvarchar(max)改成ntext等。但text轉ntext
或ntext轉text,使用語法就是會發生錯誤。
步驟四 : 既然也不能用語法直接改,那就google看看。有朋友是先新增ntext欄位後,再將text欄位
的內容搬過去。完成資料移動後再將text欄位Drop掉,並將新欄位名稱ReName成舊欄位名稱。執
行結果如下圖,很簡單地完成了。
語法 :
/*新增2個型態為NTEXT的欄位*/
ALTER TABLE [dbo].[SubLabelText] ADD [SubLabelTextTW_N] NTEXT,[SubLabelTextEN_N] NTEXT;
GO
/*將原來TEXT欄位資料搬到型態為NTEXT的欄位*/
UPDATE [dbo].[SubLabelText] SET [SubLabelTextTW_N]=[SubLabelTextTW],[SubLabelTextEN_N]=[SubLabelTextEN];
GO
/*DROP掉TEXT欄位*/
ALTER TABLE [dbo].[SubLabelText] DROP COLUMN [SubLabelTextTW],[SubLabelTextEN];
GO
/*將新欄位RENAME成就欄位名稱*/
EXEC sp_rename 'dbo.SubLabelText.SubLabelTextTW_N', 'SubLabelTextTW', 'COLUMN';
GO
EXEC sp_rename 'dbo.SubLabelText.SubLabelTextEN_N', 'SubLabelTextEN', 'COLUMN';
GO
步驟五 : 由下圖可以看見資料表欄位已經成功地由text轉成ntext了。
注意 : 在未來的 Microsoft SQL Server 版本中,將移除 ntext、text 和 image 等資料類型。
參考資料來源 : http://msdn.microsoft.com/zh-tw/library/ms187993.aspx
我是ROCK
rockchang@mails.fju.edu.tw