USE Test;
-- 第一次執行:成功
EXEC sp_rename 'd_s_t.avg_grade', 'avg_g', 'COLUMN';
-- 第二次執行:失敗
EXEC sp_rename 'd_s_t.avg_grade', 'avg_g', 'COLUMN';
-- 錯誤:參數 @objname 不明確或所宣告的 @objtype (COLUMN) 有誤
第一次執行後,欄位已從 avg_grade 重新命名為 avg_g。第二次仍使用舊名稱 d_s_t.avg_grade,該物件已不存在,故報錯「不明確」。
-- 第一次:avg_grade → avg_g
EXEC sp_rename 'd_s_t.avg_grade', 'avg_g', 'COLUMN';
-- 若需再次修改:必須使用「目前」名稱
EXEC sp_rename 'd_s_t.avg_g', 'avg_g_new', 'COLUMN';
sp_rename
[ @objname = ] 'object_name' , -- 格式:schema.table.column / table.column
[ @newname = ] 'new_name' , -- 僅新名稱,不要加 schema.table
[ @objtype = ] 'object_type' -- COLUMN, INDEX, OBJECT, DATABASE, USERDATATYPE
| 項目 | 說明 |
|---|---|
| @newname 格式 | 僅單純名稱 (如 avg_g),不要 加 table. 或 schema. 前綴 |
| 執行後警告 | 「注意: 變更物件名稱的任何部分都可能會破壞指令碼和預存程序」屬正常提醒 |
| 相依物件 | 檢視、預存程序、函數、觸發器中引用舊欄位名稱將失效,需同步修改 |
| 權限需求 | 需 ALTER TABLE 權限 (通常為 db_ddladmin 或 db_owner) |
-- 將所有表的 CreateDate 重命名為 CreatedAt
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'EXEC sp_rename ''' + QUOTENAME(SCHEMA_NAME(o.schema_id)) + '.' + QUOTENAME(o.name) + '.CreateDate'', ''CreatedAt'', ''COLUMN'';'
FROM sys.objects o
JOIN sys.columns c ON o.object_id = c.object_id
WHERE o.type = 'U' AND c.name = 'CreateDate';
PRINT @sql;
-- EXEC sp_executesql @sql;