La respuesta de James funciona bien si conoce el nombre de la restricción real. Lo difícil es que en los escenarios heredados y en otros escenarios del mundo real, no puede saber cómo se llama la restricción.
Si este es el caso corre el riesgo de crear restricciones duplicados, para evitar que puede utilizar:
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
es la bit si existe, estoy realmente después ... lo siento. actualizaré mi pregunta para que quede más claro. – solrevdev
Lo siento, John se perdió ese pedacito, actualizaré mi respuesta –
Si está utilizando Llaves foráneas generadas por EF con puntos en el nombre, necesita poner corchetes alrededor de los nombres como este [dbo]. [FK_dbo.MyTable_Etc] –