I also think it's a shortcoming in SQL server to not have a cascading drop available. I worked my way around it by querying the system tables in the same way as other people described here:
- INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE only lists foreign keys, primary keys and unique constraints.
- The only way to look for default constraints is to look for them in sys.default_constraints.
- what hasn't been mentioned here yet, is that indexes also make dropping a column fail, so you also need to drop all indexes that use your column before you can proceed with dropping a column.
The resulting script is not pretty, but I put it in a stored procedure to be able to reuse it:
CREATE PROCEDURE DropColumnCascading @tablename nvarchar(500), @columnname nvarchar(500)ASSELECT CONSTRAINT_NAME, 'C' AS typeINTO #dependenciesFROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME = @tablename AND COLUMN_NAME = @columnnameINSERT INTO #dependenciesselect d.name, 'C'from sys.default_constraints djoin sys.columns c ON c.column_id = d.parent_column_id AND c.object_id = d.parent_object_idjoin sys.objects o ON o.object_id = d.parent_object_idWHERE o.name = @tablename AND c.name = @columnnameINSERT INTO #dependenciesSELECT i.name, 'I'FROM sys.indexes iJOIN sys.index_columns ic ON ic.index_id = i.index_id and ic.object_id=i.object_idJOIN sys.columns c ON c.column_id = ic.column_id and c.object_id=i.object_idJOIN sys.objects o ON o.object_id = i.object_idwhere o.name = @tableName AND i.type=2 AND c.name = @columnname AND is_unique_constraint = 0DECLARE @dep_name nvarchar(500)DECLARE @type nchar(1)DECLARE dep_cursor CURSORFOR SELECT * FROM #dependenciesOPEN dep_cursorFETCH NEXT FROM dep_cursor INTO @dep_name, @type;DECLARE @sql nvarchar(max)WHILE @@FETCH_STATUS = 0BEGIN SET @sql = CASE @type WHEN 'C' THEN 'ALTER TABLE ['+ @tablename +'] DROP CONSTRAINT ['+ @dep_name +']' WHEN 'I' THEN 'DROP INDEX ['+ @dep_name +'] ON dbo.['+ @tablename +']' END print @sql EXEC sp_executesql @sql FETCH NEXT FROM dep_cursor INTO @dep_name, @type;ENDDEALLOCATE dep_cursorDROP TABLE #dependenciesSET @sql = 'ALTER TABLE ['+ @tablename +'] DROP COLUMN ['+ @columnname +']'print @sqlEXEC sp_executesql @sql