2016-03-29 15 views
2

Ich habe einen Fremdschlüssel ohne Angabe des Namens erstellt, so dass SQL Server ihn mit automatisch generiertem Namen erstellt hat. Jetzt möchte ich die Spalte löschen, die diesen Fremdschlüssel hat. Das Problem ist, dass ich den Namen dieses Fremdschlüssels nicht kenne. Gibt es eine Möglichkeit, alle Fremdschlüssel für bestimmte Spalte in bestimmten Tabelle zu löschen?So löschen Sie Fremdschlüssel einer bestimmten Spalte

Bisher habe ich dieses Skript gefunden, die alle Standardeinschränkungen für Spalte fällt

DECLARE @tableName VARCHAR(MAX) 
DECLARE @ConstraintName nvarchar(200) 
DECLARE @columnName VARCHAR(MAX) 

SET @tableName = 'tablename' 
SET @columnName = 'columnname' 
SELECT @ConstraintName = Name 
FROM SYS.DEFAULT_CONSTRAINTS 
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) 
AND PARENT_COLUMN_ID = (
    SELECT column_id FROM sys.columns 
    WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName)) 
IF @ConstraintName IS NOT NULL 
    BEGIN 
EXEC('ALTER TABLE '[email protected]+' DROP CONSTRAINT ' + @ConstraintName) 
END 

ALTER TABLE [tablename] DROP COLUMN columnname 
GO 

Aber es mit Fremdschlüssel-Constraints nicht hilft.

+1

'EXEC sp_help 'TABLE_NAME';' Kopieren Sie den FK-Einschränkungsnamen aus der Ergebnismenge und löschen Sie ihn dann mit dem Befehl 'DROP CONSTRAINT'! –

Antwort

3

Wenn Sie mehr Informationen über FK und speziell über ein bestimmtes Schema und eine Tabelle erhalten möchten, können Sie diese verwenden.

SELECT 
    t.Name as TableName, 
    c.name as ColumnName, 
    fk.name as FK_NAME 

FROM sys.foreign_keys as fk 
inner join sys.tables as t on fk.parent_object_id = t.object_id 
inner join sys.columns as c on c.object_id = t.object_id 
inner join sys.schemas as sc on t.schema_id = sc.schema_id 
WHERE sc.name = 'Schema' and t.name = 'Table' and c.name = 'Column' 

Wenn Sie nur über bestimmte Spalte interessiert sind, dann kann u Ross Presser Antwort verwenden.

Auch wenn Sie alle fk Einschränkung löschen möchten Sie dies ausführen:

Declare @sql nvarchar(4000) 
    SET @sql = N''; 

    SELECT @sql = @sql + ' 
    ALTER TABLE [' + sc.NAME + '].[' + OBJECT_NAME(fk.parent_object_id) + ']' + ' DROP CONSTRAINT ' + '[' + fk.NAME + '] 
    ' 
    FROM sys.foreign_keys as fk 
    inner join sys.tables as t on fk.parent_object_id = t.object_id 
    inner join sys.columns as c on c.object_id = t.object_id 
    inner join sys.schemas as sc on t.schema_id = sc.schema_id 
    WHERE sc.name = 'schemaName' and c.name = 'columnName' -- you can include and fk name 
    ORDER BY fk.NAME 
    PRINT @sql; 
--EXEC sys.sp_executesql @sql; 
0

Sie können alle Einschränkungen in der gesamten Datenbank, die die Spalte verwenden, finden:

SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU 
WHERE CCU.COLUMN_NAME='someColumn' 

Der Ausgang gibt den Namen des Constraints und die Tabelle an sie gebunden ist.

2

Sie können alle Beschränkungsliste erhalten zusammen mit den zu bestimmten Tabellen mit Hilfe der folgenden Abfrage zugewiesenen Namen:

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME='YourTableName'; 

Sobald Sie die Einschränkung Sie finden Sie löschen können von unten Abfrage es mit Hilfe tun:

ALTER TABLE Orders 
DROP CONSTRAINT constraint_name; 
Verwandte Themen