удалить все таблицы SQL, которые появляются в запросе - PullRequest
0 голосов
/ 02 июля 2018

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

-- Any location where TARGET appears, replace TARGET with the database to be 
-- modified
-- Any location where MODEL appears, replace MODEL with the database being 
-- used as a model for comparison

select 'TARGET' as dbname, t1.table_name
from TARGET.[INFORMATION_SCHEMA].[tables] as t1
where table_name not in (select t2.table_name
from 
MODEL.[INFORMATION_SCHEMA].[tables] as t2  
)

Это дает мне результаты, которые мне нужны, но теперь мне нужно выяснить, как бросать столы. Боюсь, я совершенно потерян в этот момент. Не возражал бы против способа объявления переменных вместо повторного ввода имени DBname, но не уверен, что смогу в этом случае.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

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

select 'TARGET' as dbname, t1.table_name
     , ROW_NUMBER() OVER (Partition By t1.table_name) AS RowNumber
INTO #temp
from TARGET.[INFORMATION_SCHEMA].[tables] as t1
where table_name not in (select t2.table_name
                         from MODEL.[INFORMATION_SCHEMA].[tables] as t2)

DECLARE @counter INT = 1
DECLARE @maxNum INT
SELECT @maxNum = MAX(RowNumber) FROM #temp

While @counter <= @maxNum
   BEGIN
       DECLARE @tableName AS VARCHAR(MAX)
       SELECT @tableName = table_name FROM #temp WHERE RowNumber = @counter

       DELETE TABLE @tableName ' This may not be possible, but follow my lead

       @counter += 1
   END

DROP TABLE #temp

Я не уверен, является ли "DELETE TABLE @tableName" правильной командой, но, вероятно, существует очень похожее решение, использующее то, что я вам дал. Я предполагаю, что это T-SQL ..

0 голосов
/ 02 июля 2018

Вы можете использовать динамический SQL:

DECLARE @sql NVARCHAR(MAX) = N'';

select @sql += CONCAT('DROP TABLE ',QUOTENAME(t1.table_name,''''),';',CHAR(13))
from TARGET.[INFORMATION_SCHEMA].[tables] as t1
where table_name not in (select t2.table_name
                        from MODEL.[INFORMATION_SCHEMA].[tables] as t2);

SELECT @sql; -- debug
--EXEC(@sql);

EDIT:

MySQL (может понадобиться придирки):

SET @s = (select GROUP_CONCAT('DROP TABLE ''' + t1.table_name + ''';' SEPARATOR CHAR(13))
         from TARGET.INFORMATION_SCHEMA.tables as t1
         where table_name not in (select t2.table_name
                                  from MODEL.INFORMATION_SCHEMA.tables as t2));
SELECT @s; -- debug
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
...