How do I drop a foreign key constraint only if it exists in sql server?

前端 未结 11 1650
礼貌的吻别
礼貌的吻别 2020-12-04 05:34

I can drop a table if it exists using the following code but do not know how to do the same with a constraint:

IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJE         


        
11条回答
  •  广开言路
    2020-12-04 05:50

    James's answer works just fine if you know the name of the actual constraint. The tricky thing is that in legacy and other real world scenarios you may not know what the constraint is called.

    If this is the case you risk creating duplicate constraints, to avoid you can use:

    create function fnGetForeignKeyName
    (
        @ParentTableName nvarchar(255), 
        @ParentColumnName nvarchar(255),
        @ReferencedTableName nvarchar(255),
        @ReferencedColumnName nvarchar(255)
    )
    returns nvarchar(255)
    as
    begin 
        declare @name nvarchar(255)
    
        select @name = fk.name  from sys.foreign_key_columns fc
        join sys.columns pc on pc.column_id = parent_column_id and parent_object_id = pc.object_id
        join sys.columns rc on rc.column_id = referenced_column_id and referenced_object_id = rc.object_id 
        join sys.objects po on po.object_id = pc.object_id
        join sys.objects ro on ro.object_id = rc.object_id 
        join sys.foreign_keys fk on fk.object_id = fc.constraint_object_id
        where 
            po.object_id = object_id(@ParentTableName) and 
            ro.object_id = object_id(@ReferencedTableName) and
            pc.name = @ParentColumnName and 
            rc.name = @ReferencedColumnName
    
        return @name
    end
    
    go
    
    declare @name nvarchar(255)
    declare @sql nvarchar(4000)
    -- hunt for the constraint name on 'Badges.BadgeReasonTypeId' table refs the 'BadgeReasonTypes.Id'
    select @name = dbo.fnGetForeignKeyName('dbo.Badges', 'BadgeReasonTypeId', 'dbo.BadgeReasonTypes', 'Id')
    -- if we find it, the name will not be null
    if @name is not null 
    begin 
        set @sql = 'alter table Badges drop constraint ' + replace(@name,']', ']]')
        exec (@sql)
    end
    

提交回复
热议问题