2017-03-27 27 views

Odpowiedz

6

Istnieje tabela o nazwie INFORMATION_SCHEMA.TABLE_CONSTRAINTS, która przechowuje wszystkie ograniczenia tabel. typ ograniczenia FOREIGN KEY jest również zachowywany w tym stole. Tak więc poprzez filtrowanie tego typu można dotrzeć do wszystkich kluczy obcych.

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' 

Jeśli tworzysz zapytanie dynamiczny (dla DROP -ing klucz obcy) w celu zmiany tabeli, można dotrzeć do celu zmianę ograniczenia wszystkich stołach.

WHILE(EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME IN ('Table1', 'Table2') AND CONSTRAINT_NAME LIKE '%FK__%__DL%')) 
BEGIN 
    DECLARE @sql_alterTable_fk NVARCHAR(2000) 

    SELECT TOP 1 @sql_alterTable_fk = ('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']') 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' 
      AND TABLE_NAME IN ('Table1', 'Table2') 
      AND CONSTRAINT_NAME LIKE '%FK__%__DL%' 

    EXEC (@sql_alterTable_fk) 
END 

EXISTS funkcja z parametrem zapewnia, że ​​istnieje co najmniej jeden ograniczeniem dla klucza obcego.

+0

Dzięki za pomoc Jak mogę usunąć wszystkie klucze obce, GDZIE TABLE_NAME IN ("Tabela 1", "Tabela 2") ORAZ CONSTRAINT_NAME LIKE "% FK __% __ DL%" –

+1

Wpis został zaktualizowany. –

+0

Msg 3728, poziom 16, Stan 1, wiersz 1 "FK__Stock__DL3__6E0C4425" nie jest ograniczeniem. Msg 3727, poziom 16, stan 0, wiersz 1 Nie można usunąć ograniczenia. Zobacz poprzednie błędy. –