qui va la mia versione che scende vincoli tutti i dipendenti - vincolo predefinito (se esiste) e tutti colpiti vincoli di controllo (come standard SQL sembra suggerire e come alcuni altri database sembrano così)
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
(Attenzione: sia TableName
e ColumnToBeDropped
apparire due volte nel codice sopra)
Questo funziona con la costruzione di un'unica ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped
ed eseguirlo.
fonte
2015-01-05 08:42:32
+1 Grazie mille. Funziona anche in SQL 2012. – gotqn
La prima query funzionava perfettamente in SQL 2008 r2 quando ho trovato l'ID oggetto della tabella prima con 'DECLARE @ParentObjectId INT = (selezionare OBJECT_ID da sys.objects dove nome = 'ParentTable' AND type = 'U')' e aggiunto 'WHERE parent_object_id = @ ParentObjectId' alla query. Altrimenti si ottengono tutti i vincoli predefiniti nel database. – Torrents
Questo è bello, ma non mostra lo schema in cui si trovano le tabelle. Sarebbe bello se tu aggiungessi un join a sys.schemas. – AperioOculus