Wenn es darum geht, Daten aus Tabellen zu löschen, die Fremdschlüsselbeziehungen haben - was im Grunde bei jeder richtig konzipierten Datenbank der Fall ist - können wir alle Beschränkungen deaktivieren, alle Daten löschen und dann die Beschränkungen wieder aktivieren
-- 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"
Mehr über die Deaktivierung von Beschränkungen und Auslösern ici
wenn einige der Tabellen Identitätsspalten haben, wollen wir sie vielleicht neu sortieren
EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"
Beachten Sie, dass sich das Verhalten von RESEED zwischen einer brandneuen Tabelle und einer Tabelle unterscheidet, in die zuvor Daten aus BOL :
DBCC CHECKIDENT ('tabellenname', RESEED, newReseedValue)
Der aktuelle Identitätswert wird auf den newReseedValue gesetzt. Wenn keine Zeilen Zeilen in die Tabelle eingefügt wurden, seit sie erstellt wurde, wird die erste eingefügte Zeile nach der Ausführung von DBCC CHECKIDENT newReseedValue als Identität verwenden. Andernfalls wird die nächste eingefügte Zeile newReseedValue + 1 verwendet. Wenn der Wert von newReseedValue kleiner ist als der Maximalwert in der Identitätsspalte, wird die Fehlermeldung 2627 erzeugt bei nachfolgenden Verweisen auf die Tabelle erzeugt.
Dank an Robert für den Hinweis auf die Tatsache, dass die Deaktivierung von Beschränkungen die Verwendung von truncate nicht zulässt; die Beschränkungen müssten gelöscht und dann neu erstellt werden