2013-10-25 42 views
2

我有一些需要定期删除的表格。表名有时会改变,但表名始终以'db_comp_temp'开始。是否有可能写一些SQL,将有效做这样的事情:一次删除多个表格

DROP TABLE db_comp_temp* 

由于提前,

回答

5

没有,是在DDL不支持通配符。

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

SELECT @sql += N'DROP TABLE ' + QUOTENAME(s.name) 
    + '.' + QUOTENAME(t.name) + '; 
' FROM sys.tables AS t 
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id] 
WHERE t.name LIKE N'db[_]comp[_]temp%'; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 

或者:

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

SELECT @sql += N' 
    ,' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) 
FROM sys.tables AS t 
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id] 
WHERE t.name LIKE N'db[_]comp[_]temp%'; 

SET @sql = N'DROP TABLE ' + STUFF(@sql, 1, 1, ''); 

PRINT @sql; 
-- EXEC sp_executesql @sql; 

你也可以用FOR XML PATH做,但我不认为这是必要的,当你不分组结果到另一个外部查询。

+1

我喜欢用''''分开的DROP语句对单个调用sp_executeSQL,而不是循环中的多个调用(这正是我所想的) –

+0

通配符ish删除是相当可怕的。您需要确保您确实想要删除所有内容。不过我喜欢这项工作......它绝对精彩! – logixologist

+0

@ConradFrix我在想同一件事情,用循环来攻击它......太棒了! – logixologist