Как Вы усекаете все таблицы в базе данных с помощью TSQL?

196
задан Brian Tompsett - 汤莱恩 19 October 2015 в 00:55
поделиться

9 ответов

Для SQL 2005,

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'

Пара больше ссылок для 2000 и 2005/2008..

180
ответ дан Gulzar Nazim 23 November 2019 в 05:16
поделиться

Это одно способ сделать это..., там вероятны 10 других, которые лучше/больше эффективны, но оно кажется, что это делается очень нечасто, таким образом, здесь идет...

получают список tables от sysobjects, затем цикл по тем с курсором, звоня sp_execsql('truncate table ' + @table_name) для каждого iteration.

2
ответ дан Ben Scheirman 23 November 2019 в 05:16
поделиться

Не делайте этого! Действительно, не хорошая идея.

, Если Вы знаете, какие таблицы Вы хотите усечь, создайте хранимую процедуру, которая усекает их. Можно зафиксировать порядок избежать проблем внешнего ключа.

, Если Вы действительно хотите усечь их всех (таким образом, Вы можете BCP загружать их, например) Вы были бы так же быстры, чтобы отбросить базу данных и создать новую с нуля, которая будет обладать дополнительным преимуществом, которое Вы знаете точно, где Вы.

6
ответ дан Ben Liddicott 23 November 2019 в 05:16
поделиться

Усечение всех таблиц будет только работать, если у Вас не будет отношений внешнего ключа между Вашими таблицами, поскольку SQL Server не позволит Вам усекать таблицу с внешним ключом.

альтернатива этому должна определить таблицы с внешними ключами и удалить из них сначала, можно тогда усечь таблицы без внешних ключей впоследствии.

См. http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 и http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 для получения дальнейшей информации.

12
ответ дан marcj 23 November 2019 в 05:16
поделиться

При контакте с удалением данных из таблиц, которые имеют отношения внешнего ключа - который в основном имеет место с любой правильно разработанной базой данных - мы можем отключить все ограничения, удалить все данные и затем повторно включить ограничения

-- 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"
[еще 117] при отключении ограничений и триггеров здесь

, если некоторые таблицы имеют столбцы идентификационных данных, мы можем хотеть пересеять их

EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"

Примечание, которое ПЕРЕСЕВАЕТ поведение, отличается между совершенно новой таблицей и той, которая имела некоторые данные, вставленные ранее от BOL:

DBCC CHECKIDENT ('table_name', ПЕРЕСЕЙТЕ, newReseedValue)

, текущее значение идентификационных данных установлено к newReseedValue. Если никакие строки не были вставлены в таблицу, так как она была создана, первая строка, вставленная после выполнения DBCC CHECKIDENT, будет использовать newReseedValue в качестве идентификационных данных. Иначе следующая вставленная строка будет использовать newReseedValue + 1. Если значение newReseedValue будет меньше, чем максимальное значение в столбце идентификационных данных, сообщение об ошибке 2627 будет сгенерировано на последующих ссылках на таблицу.

Благодаря Robert для указания на то, что отключение ограничений не позволяет использовать усеченный, ограничения должны были бы быть отброшены, и затем воссоздали

408
ответ дан Alex McMillan 23 November 2019 в 05:16
поделиться

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

Это или сохранить резервную копию вашей пустой БД и восстановить ее поверх старой один

0
ответ дан 23 November 2019 в 05:16
поделиться

Это намного проще (и, возможно, даже быстрее) для создания сценария базы данных, а затем просто перетащите ее и создайте из сценария.

3
ответ дан 23 November 2019 в 05:16
поделиться

Альтернативный вариант, который я предпочитаю использовать с MSSQL Server Deveploper или Enterprise, - это создание моментального снимка базы данных сразу после создания пустой схемы. На этом этапе вы можете просто продолжить восстановление базы данных обратно в моментальный снимок.

7
ответ дан 23 November 2019 в 05:16
поделиться

Создайте пустую "шаблонную" базу данных, сделайте полную резервную копию. Когда вам нужно обновить, просто восстановите, используя WITH REPLACE. Быстрый, простой, пуленепробиваемый. И если паре таблиц здесь или там нужны какие-то базовые данные (например, информация о конфигурации или просто базовая информация, которая заставляет ваше приложение работать), она тоже обрабатывается.

3
ответ дан 23 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: