2016-05-25 6 views
1

У меня есть группа db-таблиц, и я хочу удалить все, кроме одного. Мой сценарий выглядит следующим образом. Однако я создал бесконечный цикл, когда я запускаю свою попытку.Как удалить все таблицы, кроме 1

Любые идеи, как я могу это сделать?

/* Drop all tables */ 
DECLARE @name VARCHAR(128) 
DECLARE @SQL VARCHAR(254) 

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects 
       WHERE [type] = 'U' AND category = 0 ORDER BY [name]) 

WHILE @name IS NOT NULL 
IF @name != 'tableNotToBeDropped' 
BEGIN 
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']' 
    EXEC (@SQL) 
    PRINT 'Dropped Table: ' + @name 
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects 
        WHERE [type] = 'U' AND category = 0 AND [name] > @name 
        ORDER BY [name]) 
END 
GO 

ответ

6

Нет необходимости в цикле. DROP TABLE может уронить несколько таблиц с помощью одного оператора:

DECLARE @tables NVARCHAR(MAX) = 
     STUFF((SELECT ',' + QUOTENAME([table_name]) AS [text()] 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE table_schema = 'dbo' 
       AND TABLE_NAME <> 'tableNotToBeDropped' 
       FOR XML PATH('')),1,1,''); 

DECLARE @sql NVARCHAR(MAX) = 'DROP TABLE ' + @tables; 

-- debug 
SELECT @sql; 

EXEC sp_executesql @sql; 

LiveDemo

Как это работает:

  1. Получить все имена таблиц из конкретной схемы, кроме одного
  2. НАПИСАТЬ разделенные запятой лист
  3. Падающие столы

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

-1

Я предлагаю вам вместо этого использовать курсор и добавить имя, не равное предложению where запроса курсора.

http://www.kodyaz.com/articles/sql-cursor-example-tables-rows-count-using-sql-server-cursor.aspx

+1

Там нет необходимости в каких-либо зацикливание на что-то вроде этого. –

+0

Он пытался сделать петлю. Я знаю, что им не обязательно быть одним, но некоторым людям не нравится систека xml. –

+0

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

1

Это один лайнер также работает:

sp_MSforeachtable @command1='IF OBJECT_ID(''?'') NOT IN (OBJECT_ID(''TableToNotDelete'')) DROP TABLE ?' 
+1

Это еще один способ использования курсора. Не нужно зацикливаться здесь. И это недокументировано. ;) –

Смежные вопросы