删除查询中出现的所有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_名称,否则会引发错误。但是你让我走上了正确的道路,非常感谢!