只是为了澄清,这不是一个真正的问题,对于像我这样寻找答案的人来说更有帮助.
很多应用程序都会创建临时表等,但是当Team Foundation Server在我的测试SQL Server上创建了80多个数据库时,我感到很惊讶.TFS没有正确安装,请让我在它之后清理.由于每个数据库都有一个命名约定,而不是手动删除每个数据库,我记得如何使用游标并编写了我认为有史以来最不明智的T-SQL:
CREATE TABLE #databaseNames (name varchar(100) NOT NULL, db_size varchar(50), owner varchar(50), dbid int, created date, status text, compatibility_level int);
INSERT #databaseNames
exec sp_helpdb;
DECLARE dropCur CURSOR FOR
SELECT name FROM #databaseNames WHERE name like '_database_name_%';
OPEN dropCur;
DECLARE @dbName nvarchar(100);
FETCH NEXT FROM dropCur INTO @dbName;
DECLARE @statement nvarchar(200);
WHILE @@FETCH_STATUS = 0
BEGIN
SET @statement = 'DROP DATABASE ' + @dbName;
EXEC sp_executesql @statement;
FETCH NEXT FROM dropCur INTO @dbName;
END
CLOSE dropCur;
DEALLOCATE …Run Code Online (Sandbox Code Playgroud) 以下SQL根据它们的关系分隔表.问题在于在3000系列下排序的表格.作为外键的一部分并使用外键的表.任何人都有一些聪明的递归CTE或一个存储过程来进行必要的排序?程序连接到数据库不被视为解决方案.
编辑:我根据第一个解决方案在"答案"中发布了答案对于任何重新发布我自己的"正确"答案的人来说,免费"正确答案"!
WITH
AllTables(TableName) AS
(
SELECT OBJECT_SCHEMA_NAME(so.id) +'.'+ OBJECT_NAME(so.id)
FROM dbo.sysobjects so
INNER JOIN sys.all_columns ac ON
so.ID = ac.object_id
WHERE
so.type = 'U'
AND
ac.is_rowguidcol = 1
),
Relationships(ReferenceTableName, ReferenceColumnName, TableName, ColumnName) AS
(
SELECT
OBJECT_SCHEMA_NAME (fkey.referenced_object_id) + '.' +
OBJECT_NAME (fkey.referenced_object_id) AS ReferenceTableName
,COL_NAME(fcol.referenced_object_id,
fcol.referenced_column_id) AS ReferenceColumnName
,OBJECT_SCHEMA_NAME (fkey.parent_object_id) + '.' +
OBJECT_NAME(fkey.parent_object_id) AS TableName
,COL_NAME(fcol.parent_object_id, fcol.parent_column_id) AS ColumnName
FROM sys.foreign_keys AS fkey
INNER JOIN sys.foreign_key_columns AS fcol ON
fkey.OBJECT_ID = fcol.constraint_object_id
),
NotReferencedOrReferencing(TableName) AS
(
SELECT …Run Code Online (Sandbox Code Playgroud) 我在这个问题上找到了另一个帖子,但是我无法使用它的解决方案,所以我想我会更清楚和详细地询问.
我有一个代表vBulletin论坛的大型MySQL数据库.几年来,这个论坛已经对每个视图生成一个错误,每次创建一个名为新表aagregate_temp_1251634200,aagregate_temp_1251734400等等等,有在数据库中这些表的约20,000,我想将它们全部删除.
我想发出一个相当于的命令DROP TABLE WHERE TABLE_NAME LIKE 'aggregate_temp%';.
不幸的是,这个命令不起作用,谷歌对这个问题的结果充满了我所理解的精心设计的存储过程,而且所有这些程序似乎都适合不同海报的更复杂的问题.
是否可以编写一个基于name like匹配丢弃多个表的简单语句?
我在测试一些 SQL 命令时创建了很多表和用户,现在我不记得所有的表和用户名。
但是现在我想为我的大项目删除所有这些。那么是否可以在 SQL 命令行中删除它?