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

刪除 SQL Server 資料表欄位預設值條件約束腳本

     編輯:關於SqlServer

問題背景

當資料表欄位設有 `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 '找不到對應的預設條件約束,無需操作。';

腳本邏輯解析

  1. sysobjects.xtype = 'D' 篩選 DEFAULT 條件約束物件。
  2. sysconstraints 連結條件約束與資料表欄位 (colid)。
  3. syscolumns 依資料表與欄位名稱取得 colid。
  4. 動態 SQL 執行 `ALTER TABLE ... DROP CONSTRAINT`。

現代版本 (SQL 2005+) 更簡潔寫法

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 防止識別碼包含特殊字元/保留字。
  • 可一次處理多個欄位/資料表。

SSMS 圖形介面操作

  1. 物件總管展開資料表 → 欄位 → 右鍵目標欄位 → 修改。
  2. 設計師中點選欄位 → 屬性視窗 → 預設值或繫結 → 清空內容 → 儲存 (SSMS 會自動產生 DROP CONSTRAINT 腳本)。

驗證腳本

SELECT name, definition, parent_object_id, parent_column_id
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID('YourTableName');
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved