删除查询中出现的所有SQL表

删除查询中出现的所有SQL表,sql,sql-server,ssms,sql-server-2016,Sql,Sql Server,Ssms,Sql Server 2016,我试图开发一个脚本来比较两个数据库,以确定一个数据库中的额外表,然后删除这些表。以下是我当前用于定位无关表的脚本: -- 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 com

我试图开发一个脚本来比较两个数据库,以确定一个数据库中的额外表,然后删除这些表。以下是我当前用于定位无关表的脚本:

-- 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,但我不确定在这个实例中是否可以

您可以使用动态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);
编辑: 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;

我的直接想法是为查询中的每个结果分配一个行号,并将结果放入临时表中。使用一个从1开始的while循环,并循环通过该临时表中的最大编号,以获得分配给每个循环的行编号的表的名称。使用该名称从数据库中删除

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。

使用动态SQL您看过SSDT中的模式比较工具吗?工具->SQL Server->新架构比较。它会为你编写脚本。只是好奇:你能把它转换成MySQL吗?我在找一个朋友…@nicomp当然,我会准备代码差异将准备声明和组_CONCAT;太接近了!我不得不做一些调整。更改select CONCAT'DROP TABLE',QUOTENAMEt1.TABLE_名称,CONCAT'DROP TABLE','',QUOTENAMEt1.TABLE_名称,否则会引发错误。但是你让我走上了正确的道路,非常感谢!