當資料表欄位設有 `DEFAULT` 條件約束時,直接 `ALTER COLUMN` 變更型別或 `DROP COLUMN` 會報錯:
The object 'DF__Table__Col__...' is dependent on column 'Col'.
必須先移除預設條件約束。
DECLARE
@tablename VARCHAR(100) = 'YourTableName', -- 修改此處:資料表名稱
@columnname VARCHAR(100) = 'YourColumnName', -- 修改此處:欄位名稱
@defname VARCHAR(100),
@cmd VARCHAR(200);
-- 從系統表查詢預設條件約束名稱
SELECT @defname = A.name
FROM sysobjects A
JOIN sysconstraints sc ON A.id = sc.constid
WHERE OBJECT_NAME(A.parent_obj) = @tablename
AND A.xtype = 'D' -- D = DEFAULT CONSTRAINT
AND sc.colid = (
SELECT colid FROM syscolumns
WHERE id = OBJECT_ID(@tablename) AND name = @columnname
);
-- 動態建構並執行 DROP CONSTRAINT
IF @defname IS NOT NULL
BEGIN
SET @cmd = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @defname;
EXEC (@cmd);
PRINT '已移除預設條件約束: ' + @defname;
END
ELSE
PRINT '找不到對應的預設條件約束,無需操作。';
sysobjects.xtype = 'D' 篩選 DEFAULT 條件約束物件。sysconstraints 連結條件約束與資料表欄位 (colid)。syscolumns 依資料表與欄位名稱取得 colid。DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
+ '.' + QUOTENAME(OBJECT_NAME(parent_object_id))
+ ' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID('YourTableName')
AND parent_column_id = COLUMNPROPERTY(OBJECT_ID('YourTableName'), 'YourColumnName', 'ColumnId');
IF @sql <> N'' EXEC sp_executesql @sql;
ELSE PRINT '無預設條件約束。';
sys.default_constraints 目錄檢視,語意更清晰。QUOTENAME 防止識別碼包含特殊字元/保留字。SELECT name, definition, parent_object_id, parent_column_id
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID('YourTableName');