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.
Dzięki za pomoc Jak mogę usunąć wszystkie klucze obce, GDZIE TABLE_NAME IN ("Tabela 1", "Tabela 2") ORAZ CONSTRAINT_NAME LIKE "% FK __% __ DL%" –
Wpis został zaktualizowany. –
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. –