SQLServerで制約付きのカラムを削除する
SQL Serverでテーブルのカラムを削除する際、特にDEFAULT制約が設定されている場合は注意が必要となる
この記事では、DEFAULT制約付きカラムを安全に削除する方法をまとめる
SELECT句で制約名を取得して、制約を削除後にカラムを削除するクエリ
カラムを削除する前に、関連する制約を先に削除する必要がある
しかし、制約名は自動生成されることが多く、直接指定するのは難しい
そこで、システムビューを利用して動的に制約名を取得し、削除するスクリプトを利用する
DECLARE
@tableName VARCHAR(30),
@columnName VARCHAR(30),
@tableId VARCHAR(10),
@columnId VARCHAR(10),
@constraintName NVARCHAR(128)
-- 対象テーブルを指定
SET @tableName = 'TableName'
-- 対象列を指定
SET @columnName = 'ColumnName'
-- 対象テーブルの「テーブルID」を取得
SET @tableId = (SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = @tableName)
-- 対象テーブルの「列ID」を取得
SET @columnId = (SELECT column_id FROM sys.columns WHERE object_id = @tableId AND name = @columnName)
-- 「テーブルID」と「列ID」を使用して、「制約名」を取得
SET @constraintName = (
SELECT name
FROM sys.sysobjects
WHERE id = (
SELECT constid
FROM sys.sysconstraints
WHERE id = @tableId AND colid = @columnId
)
)
-- 制約が存在する場合、削除する
IF @constraintName IS NOT NULL
BEGIN
DECLARE @sql NVARCHAR(MAX)
-- 制約を削除
SET @sql = 'ALTER TABLE ' + QUOTENAME(@tableName) + ' DROP CONSTRAINT ' + QUOTENAME(@constraintName)
EXEC sp_executesql @sql
-- カラムを削除
SET @sql = 'ALTER TABLE ' + QUOTENAME(@tableName) + ' DROP COLUMN ' + QUOTENAME(@columnName)
EXEC sp_executesql @sql
END
GO
スクリプトの解説
- 変数の宣言: テーブル名、カラム名、各種IDと制約名を格納するための変数を宣言
- テーブルIDの取得: sys.sysobjectsビューを使用して、指定されたテーブルのIDを取得
- カラムIDの取得: sys.columnsビューを使用して、指定されたカラムのIDを取得
- 制約名の取得: sys.sysobjectsとsys.sysconstraintsビューを組み合わせて、DEFAULT制約の名前を取得
- 制約の削除: 制約が存在する場合、動的SQLを使用して制約を削除
- カラムの削除: 最後に、指定されたカラムを削除