Kiedy mamy do czynienia z usuwaniem danych z tabel, które mają relacje klucza obcego - co w zasadzie ma miejsce w przypadku każdej poprawnie zaprojektowanej bazy danych - możemy wyłączyć wszystkie ograniczenia, usunąć wszystkie dane, a następnie ponownie włączyć ograniczenia
-- disable all constraints
EXEC sp_MSForEachTable "ALTER TABLE ? NOCHECK CONSTRAINT all"
-- delete data in all tables
EXEC sp_MSForEachTable "DELETE FROM ?"
-- enable all constraints
exec sp_MSForEachTable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Więcej o wyłączaniu ograniczeń i wyzwalaczy tutaj
jeśli niektóre tabele mają kolumny tożsamości, możemy je ponownie umieścić
EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"
Zwróć uwagę, że zachowanie RESEED różni się między zupełnie nową tabelą, a tą, w której wcześniej wprowadzono pewne dane z BOL:
DBCC CHECKIDENT ('nazwa_tabeli', RESEED, newReseedValue)
Bieżąca wartość tożsamości jest ustawiona na newReseedValue. Jeśli do tabeli nie wstawiono żadnych wierszy od czasu jej utworzenia, pierwszy wiersz wstawiony po wykonaniu polecenia DBCC CHECKIDENT użyje nowej wartościReseedValue jako tożsamości. W przeciwnym razie następny wstawiony wiersz użyje nowej wartościReseedValue + 1. Jeśli wartość newReseedValue jest mniejsza niż wartość maksymalna w kolumnie tożsamości, komunikat o błędzie 2627 zostanie wygenerowany przy kolejnych odwołaniach do tabeli.
Dziękuję Robertowi za zwrócenie uwagi na fakt, że wyłączenie ograniczeń nie pozwala na użycie funkcji obcinania, ograniczenia musiałyby zostać usunięte, a następnie odtworzone