Quantcast
Channel: How to drop a column with constraints in SQL Server 2005 - Stack Overflow
Viewing all articles
Browse latest Browse all 28

Answer by Steve for How to drop a column with constraints in SQL Server 2005

$
0
0

The answer from pvolders was just what I needed but it missed statistics which were causing and error. This is the same code, minus creating a stored procedure, plus enumerating statistics and dropping them. This is the best I could come up with so if there is a better way to determine what statistics need to be dropped please add.

DECLARE @tablename nvarchar(500),         @columnname nvarchar(500)SELECT  @tablename = 'tblProject',        @columnname = 'CountyKey'SELECT 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 = 0INSERT INTO #dependenciesSELECT s.NAME, 'S'FROM sys.stats AS sINNER JOIN sys.stats_columns AS sc     ON s.object_id = sc.object_id AND s.stats_id = sc.stats_idINNER JOIN sys.columns AS c     ON sc.object_id = c.object_id AND c.column_id = sc.column_idWHERE s.object_id = OBJECT_ID(@tableName)AND c.NAME = @columnnameAND s.NAME LIKE '_dta_stat%'DECLARE @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 +']'            WHEN 'S' THEN 'DROP STATISTICS ['+ @tablename +'].['+ @dep_name +']'        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 28

Trending Articles



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