Quantcast
Channel: SQL Server 2005 drop column with constraints - Stack Overflow
Viewing all articles
Browse latest Browse all 14

Answer by pvolders for SQL Server 2005 drop column with constraints

$
0
0

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

Viewing all articles
Browse latest Browse all 14

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>