使用者定義型別 (UDT) 一經被資料表參考,即無法直接 ALTER 或 DROP,修改精度極為麻煩。
sp_rechangefieldtype遍歷所有參考該 UDT 的資料行,動態執行 ALTER TABLE ... ALTER COLUMN 變更型別,並自動處理預設值約束的移除/重建。
SP_CHANGEFIELDCREATE PROCEDURE SP_CHANGEFIELD
@OLDTYPENAME VARCHAR(50),
@NEWDTYPE VARCHAR(50)
AS
BEGIN
-- 1. 建立暫時型別
EXEC('sp_addtype U_LOCALTYPE, ''' + @NEWDTYPE + '''')
-- 2. 將所有參考舊型別的資料行改為暫時型別
EXEC sp_rechangefieldtype @OLDTYPENAME, 'U_LOCALTYPE'
-- 3. 重建所有檢視表
EXEC sp_rebuildallview
-- 4. 刪除舊型別
EXEC('sp_droptype ' + @OLDTYPENAME)
-- 5. 以原名建立新型別
EXEC('sp_addtype ' + @OLDTYPENAME + ', ''' + @NEWDTYPE + '''')
END
-- 將 UDT 'MyInt' 從 INT 改為 BIGINT
EXEC SP_CHANGEFIELD 'MyInt', 'BIGINT'
syscolumns、systypes、sysobjects 系統表cdefault)sp_rebuildallview 確保檢視表元資料同步執行者需具備 db_owner、db_ddladmin 或物件擁有者權限。