64

I'm trying to create upgrade and backout scripts in SQL. The upgrade script adds a column like so:

IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName' 
    AND object_id = OBJECT_ID(N'[dbo].[TableName]'))

ALTER TABLE TableName
    ADD ColumnName bit NOT NULL DEFAULT(0) 

The backout script removes the column like so:

IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName' 
    AND object_id = OBJECT_ID(N'[dbo].[TableName]'))

ALTER TABLE TableName
    DROP COLUMN ColumnName

However, the backout script throws this error:

Msg 5074, Level 16, State 1, Line 5
    The object 'DF__TableName__ColumnName__1BF3D5BD' is dependent on column 'ColumnName'.
Msg 4922, Level 16, State 9, Line 5
    ALTER TABLE DROP COLUMN ColumnName failed because one or more objects access this column.

I know how to drop the constraint, but the constraint's name changes everytime (the suffix changes). I either need SQL Server to stop creating this randomly-named constraint OR I need to be able to remove the constraint in my script using wild-card characters, since the name changes.

WEFX
  • 8,298
  • 8
  • 66
  • 102

3 Answers3

110

This is the default constraint that is added because of the DEFAULT(0) in your newly added column.

You can name this yourself so it has a known fixed name rather than relying on the auto name generation.

ALTER TABLE TableName
    ADD ColumnName bit NOT NULL CONSTRAINT DF_Some_Fixed_Name DEFAULT(0) 

Then to remove the column and constraint together

ALTER TABLE dbo.TableName
DROP CONSTRAINT DF_Some_Fixed_Name, COLUMN ColumnName
Martin Smith
  • 438,706
  • 87
  • 741
  • 845
  • Thanks Martin. Also, to properly check if the constraint exists (before dropping it), I used the method described **[here](http://stackoverflow.com/questions/2499332/how-to-check-if-a-constraint-exists-in-sql-server/6839547#6839547)** – WEFX Oct 05 '11 at 15:48
  • @ÁlvaroG.Vicario - yes. Martin's answer gives you an example. – A-K May 12 '14 at 13:42
5

Run this:

declare @name as nvarchar(255);
SELECT @name = name FROM dbo.sysobjects 
WHERE name LIKE 'DF__XXX__YYY__%' and type = 'D'

IF @name IS NOT NULL BEGIN
    EXEC('ALTER TABLE XXX DROP CONSTRAINT ' + @name);
END
Kenneth
  • 251
  • 4
  • 6
2

Run this if you want remove constraint:

DECLARE @tableName NVARCHAR(255) = '[INSERT]';
DECLARE @first5CharsFromColumnName NVARCHAR(255) = '[INSERT]';
DECLARE @name NVARCHAR(255);
SELECT @name = d.name FROM dbo.sysobjects d
INNER JOIN dbo.sysobjects t ON t.id = d.parent_obj
WHERE d.name LIKE '%'+@first5CharsFromColumnName+'%' AND d.type = 'D' AND t.name = @tableName

IF @name IS NOT NULL BEGIN
    EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @name);
END