6

Jak mogę wykonać to zapytanie na dowolny sposób:Jak usunąć wszystkie tabele z db? Nie można usunąć z sys.tables

delete from sys.tables where is_ms_shipped = 0 

Co się stało w tym, że wykonany bardzo dużą zapytanie i zapomniałem umieścić dyrektywę USE na wierzchu, teraz mam stoły z milionami na moim głównym dysku głównym i nie chcę ich usuwać jeden po drugim.

AKTUALIZACJA: Jest to zupełnie nowa baza danych, więc nie muszę przejmować się poprzednimi danymi. Ostatecznym rezultatem, jaki chcę osiągnąć, jest zresetowanie głównej bazy danych do wysyłki fabrycznej.

+1

Obiekty 'sys. *' Są katalogiem systemowym ** widoki **, które pozwalają na zapytanie - ale nie manipulują - widokami obiektów w bazie danych. Aby utworzyć obiekty CREATE lub DROP, użyj odpowiednich poleceń SQL. –

+0

Tak, zdałem sobie z tego sprawę. Szukałem KAŻDEGO sposobu, aby uzyskać moje zmiany. – Shimmy

Odpowiedz

1

najprostszą i najkrótszą drogę I nie było to:

How to Rebuild System Databases in SQL Server 2008

problem z wszystkich innych odpowiedzi jest to, że to nie działa, ponieważ istnieje r podniosłe tabele i odmawia wykonania.

Ten nie tylko działa, ale w rzeczywistości jest tym, czego szukam: "Zresetuj do ustawień fabrycznych", jak podano w pytaniu.
Również ten usunie wszystko, nie tylko tabele.

7

Jeśli jest to jednorazowy problem, należy użyć programu SQL Server Management Studio do usunięcia tabel.

Jeśli trzeba uruchomić skrypt bardzo ostrożnie korzystać z tego:

EXEC sp_msforeachtable 'DROP TABLE ?' 
+0

Czy możesz wypełnić resztę? Zaktualizowałem moją odpowiedź. – Shimmy

+0

@Shimmy: Zobacz zaktualizowaną odpowiedź. Spowoduje to usunięcie wszystkich tabel użytkowników w bazie danych, chyba że klucze obce zostaną najpierw usunięte. Nie usuwa jednak użytkowników, synonimów itd. –

+0

Przeczytaj także zapytanie w moim pytaniu, nie chcę usuwać WSZYSTKICH tabel, chcę tylko usunąć tabele, które przypadkowo dodano, a nie tabele, które zostały wysłane z instalacja. – Shimmy

2

Brak kopii zapasowych? :-)

Jednym z podejść może być utworzenie projektu bazy danych w Visual Studio z początkowym importem bazy danych. Następnie usuń tabele i zsynchronizuj projekt z powrotem do bazy danych. Możesz usuwać masowo to podejście, będąc jednocześnie "buforowanym" przez fazę zatwierdzania i interfejs użytkownika.

Jestem dość pewne powyższe podejście może być używany, aby dbać o relacje stołowych, a także (choć mam nie próbował w „master” przestrzeni). Polecam również użycie projektu VS DB (lub innego narzędzia do zarządzania bazami danych, które umożliwia porównywanie i synchronizację schematów), aby ułatwić życie w przyszłości, a także umożliwić śledzenie zmian schematu (np. Przy użyciu SCM).

Aha, i cokolwiek zostało zrobione, proszę najpierw utworzyć kopię zapasową. Jeśli nic innego, to jest dobre szkolenie :-)

+0

Jest to zupełnie nowa instalacja instancji, nie było nic do tworzenia kopii zapasowych ... – Shimmy

1

Niezbyt elegancko, ale jak to jest jednorazowe zadanie.

WHILE EXISTS(SELECT * FROM sys.tables where is_ms_shipped = 0) 
     EXEC sp_MSforeachtable 'DROP TABLE ?' 

Działa dobrze na tego prostego testu (kasowanie a na drugiej pętli po nieudanej pierwszej próbie i postępuje naprzód usunąć b)

create table a 
(
a int primary key 
) 
go 

create table b 
(
a int references a (a) 
) 

insert into a values (1) 

insert into b values (1) 
3

Jedną z metod, którą użyłem w przeszłości, która jest całkiem prosta i stosunkowo niezawodnia, jest zapytanie do schematów systemowych/schematu informacyjnego (w zależności od dokładnych wymagań) i wysyłanie listy poleceń, które chcę wykonać jako wyniki zestaw. Sprawdź to, skopiuj, wklej, szybko, łatwo i szybko, a ponieważ wciąż ręcznie wciskasz przycisk destruktywnego bitu, (IMHO) trudniej jest przez przypadek wyrzucić śmieci.

Na przykład:

select 'drop table ' + name + ';', * from sys.tables where is_ms_shipped = 0 
1

Kod ten może być lepiej, ale starałem się być ostrożny, jak to pisałem. Wydaje mi się, że łatwe jest dostosowanie do testów przed zatwierdzeniem usunięcia tabel.

DECLARE 
    @Prefix VARCHAR(50), 
    @TableName NVARCHAR(255), 
    @SQLToFire NVARCHAR(350) 

SET @Prefix = 'upgrade_%' 

WHILE EXISTS(
    SELECT 
     name 
    FROM 
     sys.tables 
    WHERE 
     name like @Prefix 
    ) 
BEGIN 
    SELECT 
     TOP 1 --This query only iterates if you are dropping tables 
     @TableName = name 
    FROM 
     sys.tables 
    WHERE 
     name like @Prefix 

    SET @SQLToFire = 'DROP TABLE ' + @TableName 

    EXEC sp_executesql @SQLToFire; 
END 
1

zrobiłem coś bardzo podobnego, a co ja nakręciłem ten używał Zadania up -> baza danych skrypt do skryptu tylko krople do wszystkich obiektów bazy danych pierwotnie zamierzonego bazie. To znaczy, że baza danych miała uruchomić gigantyczny skrypt, na którym go uruchomiłem. Pamiętaj, aby uwzględnić opcję IF Exists w opcjach zaawansowanych, a następnie uruchom ten skrypt względem wzorca i BAM, usuwając wszystko, co istnieje w oryginalnej docelowej bazie danych, która istnieje również w wzorcu, pozostawiając różnice, które powinny być oryginalnymi wzorcami.