web-dev-qa-db-ja.com

T-SQLでデフォルト値または同様の制約をどのように削除しますか?

私は構文を知っています:

ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]

しかし、名前がわからないときにデフォルトの制約を削除するにはどうすればよいですか? (つまり、CREATE TABLE時間。)

65
Frank Krueger

これを手動で行う場合は、Management Studioを使用して(テーブル内の[制約]ノードの下で)見つけることができます。

SQLを使用してそれを行うには:

  • 制約がデフォルトの制約である場合、sys.default_constraintsを使用して検索できます。

    SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName
    FROM sys.default_constraints ORDER BY TableName, ConstraintName
    
  • 他の制約(チェック、一意、外部キー、デフォルト、主キー)も探している場合は、sysconstraintsを使用できます。

    SELECT OBJECT_NAME(id) AS TableName, OBJECT_NAME(constid) AS ConstraintName
    FROM sysconstraints ORDER BY TableName, ConstraintName
    

使用しているSQL Serverのバージョンを言うことはありません。上記は、SQL 2005とSQL 2008の両方で機能します。

47
adrianbanks

このコードを使用して、自動的に実行できます。

DECLARE @tableName VARCHAR(MAX) = '<MYTABLENAME>'
DECLARE @columnName VARCHAR(MAX) = '<MYCOLUMNAME>'
DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name 
FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) 
AND PARENT_COLUMN_ID = (
    SELECT column_id FROM sys.columns
    WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName))
IF @ConstraintName IS NOT NULL
    EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @ConstraintName)

<MYTABLENAME>および<MYCOLUMNNAME> 適切に。

60
Polemarch

または、sys.check_constraintsカタログビューを使用して検索できます。

4
Alex_L

Sp_help [table name]で制約の名前を見つけて、名前でドロップできます。

または、おそらく管理スタジオ経由でこれを行うことができます。

3
Tetraneutron

単一行の単一のテーブルと列の場合、次を使用します

declare @sql nvarchar(max); set @sql = ''; SELECT @sql+='ALTER TABLE [dbo].[YOURTABLENAME] DROP CONSTRAINT ' + ((SELECT OBJECT_NAME(constid) FROM sysconstraints WHERE OBJECT_NAME(id) = 'YOURTABLENAME'AND colid IN (SELECT ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS Where Table_Name = 'YOURTABLENAME' and COLUMN_NAME = 'YOURCOLUMNNAM'))) + ';'; EXEC sp_executesql @sql;

列に複数の制約がある場合は、後の制約を区別する必要がありますが、デフォルトの制約がある場合はこれでうまくいきます。

Information_schemaで利用可能な他の列をチェックして、さらに区別できるようにしてください。

1
sweetfa

ここにすべての依存制約をドロップする独自のバージョンがあります-デフォルトの制約(存在する場合)および影響を受けるすべてチェック制約そうする)

declare @constraints varchar(4000);
declare @sql varchar(4000);
with table_id_column_position as (
   select object_id table_id, column_id column_position
      from sys.columns where object_id is not null and object_id = object_id('TableName') and name = 'ColumnToBeDropped'
)
select @constraints = coalesce(@constraints, 'constraint ') + '[' + name + '], '
from sysobjects 
where (
  -- is CHECK constraint
  type = 'C' 
  -- dependeds on the column
  and id is not null
  and id in (
      select object_id --, object_name(object_id)
      from sys.sql_dependencies, table_id_column_position 
      where object_id is not null
      and referenced_major_id = table_id_column_position.table_id
      and referenced_minor_id = table_id_column_position.column_position
    )
) OR (
  -- is DEFAULT constraint
  type = 'D'
  and id is not null
  and id in (
    select object_id
    from sys.default_constraints, table_id_column_position
     where object_id is not null
     and parent_object_id = table_id_column_position.table_id
     and parent_column_id = table_id_column_position.column_position
  )
);
set @sql = 'alter table TableName drop ' + coalesce(@constraints, '') + ' column ColumnToBeDropped';
exec @sql

(注意:TableNameColumnToBeDroppedの両方が上記のコードに2回現れます)

これは、単一のALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDroppedおよびそれを実行します。

0
Piotr Findeisen