Khi xử lý việc xóa dữ liệu khỏi bảng có mối quan hệ khóa ngoài - về cơ bản là trường hợp của bất kỳ cơ sở dữ liệu nào được thiết kế đúng cách - chúng ta có thể vô hiệu hóa tất cả các ràng buộc, xóa tất cả dữ liệu và sau đó bật lại các ràng buộc
-- 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"
Tìm hiểu thêm về cách tắt các ràng buộc và trình kích hoạt tại đây
nếu một số bảng có cột nhận dạng, chúng tôi có thể muốn gửi lại chúng
EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"
Lưu ý rằng hoạt động của RESEED khác nhau giữa bảng hoàn toàn mới và bảng đã được chèn một số dữ liệu trước đó từ BOL:
DBCC CHECKIDENT ('table_name', RESEED, newReseedValue)
Giá trị nhận dạng hiện tại được đặt thành newReseedValue. Nếu không có hàng nào được chèn vào bảng kể từ khi nó được tạo, hàng đầu tiên được chèn sau khi thực thi DBCC CHECKIDENT sẽ sử dụng newReseedValue làm danh tính. Ngược lại, hàng tiếp theo được chèn sẽ sử dụng newReseedValue + 1. Nếu giá trị của newReseedValue nhỏ hơn giá trị chúng tối đa trong cột nhận dạng, thông báo lỗi 2627 sẽ được tạo trên các tham chiếu tiếp theo tới bảng.
Cảm ơn Robert đã chỉ ra thực tế rằng việc tắt các ràng buộc không cho phép sử dụng truncate, các ràng buộc sẽ phải được loại bỏ và sau đó được tạo lại