首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 刪除含預設值欄位的正確步驟:先移除預設約束

     編輯:關於SqlServer

問題

直接執行 ALTER TABLE tbl DROP COLUMN col 失敗,錯誤訊息:

對象 'DF_tbl_col' 依賴於欄位 'col'。由於一或多個物件存取此欄位,ALTER TABLE DROP COLUMN 失敗。

原因:欄位擁有預設值約束,必須先移除約束才能刪除欄位。

解決腳本

-- 1. 取得預設約束名稱
DECLARE @df_name SYSNAME;
SELECT @df_name = dc.name
FROM sys.default_constraints dc
JOIN sys.columns c ON c.default_object_id = dc.object_id
JOIN sys.tables t ON t.object_id = c.object_id
WHERE t.name = 'tbl' AND c.name = 'col';

-- 2. 動態移除約束
IF @df_name IS NOT NULL
BEGIN
    DECLARE @sql NVARCHAR(MAX) = N'ALTER TABLE dbo.tbl DROP CONSTRAINT ' + QUOTENAME(@df_name);
    EXEC sp_executesql @sql;
END

-- 3. 刪除欄位
ALTER TABLE dbo.tbl DROP COLUMN col;

一鍵通用預存程序

CREATE PROCEDURE dbo.usp_DropColumnWithDefault
    @SchemaName SYSNAME,
    @TableName  SYSNAME,
    @ColumnName SYSNAME
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @df_name SYSNAME;
    SELECT @df_name = dc.name
    FROM sys.default_constraints dc
    JOIN sys.columns c ON c.default_object_id = dc.object_id
    JOIN sys.tables t ON t.object_id = c.object_id
    JOIN sys.schemas s ON s.schema_id = t.schema_id
    WHERE s.name = @SchemaName AND t.name = @TableName AND c.name = @ColumnName;

    IF @df_name IS NOT NULL
    BEGIN
        DECLARE @sql NVARCHAR(MAX) = N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N' DROP CONSTRAINT ' + QUOTENAME(@df_name);
        EXEC sp_executesql @sql;
        PRINT '已移除預設約束: ' + @df_name;
    END

    DECLARE @drop_sql NVARCHAR(MAX) = N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N' DROP COLUMN ' + QUOTENAME(@ColumnName);
    EXEC sp_executesql @drop_sql;
    PRINT '已刪除欄位: ' + @ColumnName;
END;
GO

-- 使用範例
EXEC dbo.usp_DropColumnWithDefault 'dbo', 'tbl', 'col';

圖形化介面替代方案

  • SSMS 物件總管:展開資料表 → 「欄位」 → 右鍵欄位 →「刪除」→ 系統自動詢問是否同時刪除相依約束,點選「是」。
  • 適用於單次操作;大量結構變更請使用腳本版本控管。

相關約束類型

同理適用於:CHECK、FOREIGN KEY(需先刪除 FK)、PRIMARY KEY。使用 sys.objects 依 type 篩選:D=DEFAULT, C=CHECK, F=FK, PK=PK。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved