Schema異動,將資料表欄位型態由 text 變更至 ntext

Schema異動,將資料表欄位型態由 text 變更至 ntext

 

由於一個廠商開發的系統在資料表規劃時,將會存放unicode的欄位規劃成text而不是ntext

以至於後來使用上發生問題(很多特殊字會變成亂碼)為了解決這個問題勢必要將text型態改

ntext,在異動資料欄位型態過程中遇到一些小問題,在此筆記一下。

 

 

步驟一 : 如下圖紅色圈選處,有兩個欄位型態是text

clip_image002

 

 

 

步驟二 : 如果使用UI來改的話,基本上SQL就是會針對新的Schema新建一個TABLE(如下圖)

然後將原先的資料倒入新資料表後再將新資料表ReName。耳聞一些前輩表示這樣的作法有

可能會讓資料庫Crush,所以也不建議大家用UI來改型態。

clip_image004

 

 

步驟三 : 不建議用UI改,那我們就用老方法吧 ! 直接下SQL語法來改。很直覺的寫好語法去執行

卻發生錯誤(如下圖)。系統顯示無法改變資料行的資料類型為ntext。經過測試,我可以用語法將

text改成nvarchar(max)varchar(max)也可以反向將nvarchar(max)改成ntext等。但textntext

ntexttext,使用語法就是會發生錯誤。

clip_image006

 

 

 

步驟四 : 既然也不能用語法直接改,那就google看看。有朋友是先新增ntext欄位後,再將text欄位

的內容搬過去。完成資料移動後再將text欄位Drop掉,並將新欄位名稱ReName成舊欄位名稱。執

行結果如下圖,很簡單地完成了。

clip_image008

 

語法 :


/*新增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了。

clip_image010

注意 : 在未來的 Microsoft SQL Server 版本中,將移除 ntexttext  image 等資料類型。 請避免在新的

開發工作中使用這些資料類型,並規劃修改目前在使用這些資料類型的應用程式。 nvarchar(max), varchar(max)

, varbinary(max)

 

參考資料來源 : http://msdn.microsoft.com/zh-tw/library/ms187993.aspx

我是ROCK

rockchang@mails.fju.edu.tw