Как обрезать все таблицы данной базы данных в SQL Server

#sql-server #truncate

#sql-сервер #обрезать

Вопрос:

Я должен выполнить в тестовой среде усечение всех таблиц трех разных тестовых баз данных. Мне нужен sql-запрос, который учитывает ограничения таблицы, потому что все коды, которые я тестировал в базе данных AdventureWorks, выдают следующую ошибку:

Невозможно ОБРЕЗАТЬ ТАБЛИЦУ ‘Person.CountryRegion’ потому что на него ссылается объект ‘vStateProvinceCountryRegion’

Комментарии:

1. Ошибка сообщает вам о проблеме. Вы не можете TRUNCATE использовать таблицы, если они используются другими объектами; вам придется DROP блокировать объекты, а затем воссоздавать их, если вы «должны» TRUNCATE все. Если честно, звучит как проблема XY .

2. Я попробовал следующий код gist.github.com/danguilherme/04fbe3906b46844f9351 это работает, но я не могу вручную перечислить имена таблиц. Существует ли код, который усекает все таблицы с заданным именем базы данных? В моем случае три тестовые базы данных содержат сотни таблиц

3. Как я уже упоминал, вы не можете просто слепо TRUNCATE использовать таблицы, когда существуют ограничения и привязки схемы. Сначала вам нужно будет выполнить DROP их, а затем воссоздать заново. это не тривиальная задача. Я бы лично предложил повторно развернуть вашу базу данных из вашего проекта управления версиями / базы данных, поскольку в ней не будет данных (кроме тех, которые могут быть обязательными для работы приложения).

4. Спасибо за ваш ответ, к сожалению, у меня нет проекта базы данных или сценариев создания

5. Затем вам понадобятся DROP блокирующие объекты, TRUNCATE , а затем повторно CREATE отредактированные объекты DROP после TRUNCATE завершения. Это будет очень ручная задача.

Ответ №1:

Вы могли бы попробовать что-то вроде:

 -- Disable all FK constraints...
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL";
GO

-- TRUNCATE TABLES...

-- Enable all FK constraints...
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL";
GO