2

我有一些需要定期删除的表。表的名称有时会更改,但表名称始终以“db_comp_temp”开头。是否可以编写一些实际上会执行以下操作的 SQL:

DROP TABLE db_comp_temp* 

提前致谢,

4

1 回答 1

6

不,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 sys.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 sys.sp_executesql @sql;

您也可以使用 FOR XML PATH 执行此操作,但我认为当您不将结果分组到另一个外部查询时没有必要。

于 2013-10-25T18:43:49.867 回答