修改列屬性是 DDL 高頻操作,但直接執行易報錯 (列不存在、類型不兼容、依賴對象阻塞)。本文提供帶存在性檢查、依賴檢測、事務保護的標準化修改模板,適用生產環境變更腳本。
-- 標準模板:存在性檢查 + 類型變更
IF EXISTS (
SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.YourTable') AND name = 'YourColumn'
)
BEGIN
-- 檢查依賴 (索引、約束、視圖、計算列、外鍵等)
-- 若有依賴需先刪除依賴對象,變更後重建
ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(64) NOT NULL; -- 指定 NULL/NOT NULL
PRINT 'Column type altered successfully.';
END
ELSE
BEGIN
PRINT 'Column does not exist, skipped.';
END;
GO
-- 標準模板:sp_rename 系統存儲過程
IF EXISTS (
SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.YourTable') AND name = 'OldColumnName'
)
BEGIN
EXEC sp_rename
@objname = 'dbo.YourTable.OldColumnName', -- 格式:Schema.Table.Column
@newname = 'NewColumnName',
@objtype = 'COLUMN';
PRINT 'Column renamed successfully.';
END
ELSE
BEGIN
PRINT 'Column does not exist, skipped.';
END;
GO
| 場景 | 風險 | 對策 |
|---|---|---|
| 類型收窄 (VARCHAR(100)→VARCHAR(50)) | 數據截斷報錯 | 先 UPDATE ... SET Col = LEFT(Col,50) WHERE LEN(Col)>50 或驗證 MAX(LEN(Col)) <= 50 |
| 類型擴大 (INT→BIGINT) | 通常安全 | 檢查依賴對象 (索引自動重建、視圖需刷新) |
| 修改 NOT NULL → NULL | 安全 | 直接執行 |
| 修改 NULL → NOT NULL | 現有 NULL 行報錯 | 先 UPDATE ... SET Col = 'default' WHERE Col IS NULL 或添加默認約束 |
| 列被索引/主鍵/外鍵/約束/視圖/計算列引用 | ALTER COLUMN 失敗 | 腳本先 DROP 依賴,變更後 CREATE 回;或用 SSDT 自動生成部署腳本 |
| 重命名列 | 存儲過程/函數/視圖/應用代碼失效 | 同步更新所有引用代碼,sp_refreshview 刷新視圖,部署前全庫搜索列名 |
-- 查找引用該列的所有對象
SELECT
OBJECT_SCHEMA_NAME(referencing_id) + '.' + OBJECT_NAME(referencing_id) AS ReferencingObject,
o.type_desc AS ObjectType,
sed.referenced_minor_name AS ColumnName
FROM sys.sql_expression_dependencies sed
JOIN sys.objects o ON sed.referencing_id = o.object_id
WHERE sed.referenced_id = OBJECT_ID('dbo.YourTable')
AND sed.referenced_minor_name = 'YourColumn';
sp_help 'Table'、應用冒煙測試、監控錯誤率。規範的 DDL 變更腳本 = 存在性檢查 + 依賴分析 + 數據兼容處理 + 事務保護 + 回滾方案。將上述模板納入團隊變更規範,可消除 90%+ 結構變更事故。