1. ホーム
  2. sql

[解決済み】SQLデフォルト制約の名前を知らずに削除する方法は?

2022-04-18 12:12:38

質問

Microsoft SQL Serverで、ある列にデフォルト制約が存在するかどうかを確認し、デフォルト制約を削除するクエリを知っています。

IF EXISTS(SELECT * FROM sysconstraints
  WHERE id=OBJECT_ID('SomeTable')
  AND COL_NAME(id,colid)='ColName'
  AND OBJECTPROPERTY(constid, 'IsDefaultCnst')=1)    
ALTER TABLE SomeTable DROP CONSTRAINT DF_SomeTable_ColName

しかし、データベースの以前のバージョンのタイプミスのために、制約の名前は次のようになります。 DF_SomeTable_ColName または DF_SmoeTable_ColName .

SQLエラーを出さずにデフォルト制約を削除するにはどうすればよいですか?デフォルト制約名はINFORMATION_SCHEMAテーブルには表示されないので、少し厄介です。

ですから、「このテーブル/カラムのデフォルト制約を削除する」のような、「削除する DF_SmoeTable_ColName ただし、見つからない場合はエラーを出さないようにしてください。

解決方法は?

Mitch Wheatのコードを発展させて、以下のスクリプトで制約を落とすコマンドを生成し、動的に実行します。

declare @schema_name nvarchar(256)
declare @table_name nvarchar(256)
declare @col_name nvarchar(256)
declare @Command  nvarchar(1000)

set @schema_name = N'MySchema'
set @table_name = N'Department'
set @col_name = N'ModifiedDate'

select @Command = 'ALTER TABLE ' + @schema_name + '.[' + @table_name + '] DROP CONSTRAINT ' + d.name
 from sys.tables t
  join sys.default_constraints d on d.parent_object_id = t.object_id
  join sys.columns c on c.object_id = t.object_id and c.column_id = d.parent_column_id
 where t.name = @table_name
  and t.schema_id = schema_id(@schema_name)
  and c.name = @col_name

--print @Command

execute (@Command)