在sql中删除没有行的表

Drop tables without rows in tsql

我写了这段代码:

SELECT o.name FROM sysobjects o,sysindexes i WHERE ( o.type = 'U'
      and o.id = i.id
      and i.indid in (0,1)
      and i.rows = 0 )
      order by o.name
GO

你能帮我放下那些空桌子吗?

谨慎使用!

这将为您的 query.When 中的所有表生成一个删除脚本 您打印变量 @sql 由于 PRINT语句。但是当你使用 EXEC(@sql) 时,整个代码将被执行。

DECLARE @sql NVARCHAR(MAX)
SET @sql  = ''
SELECT @sql = @sql + 'IF OBJECT_ID(''' + o.name + ''') IS NOT NULL DROP TABLE ' + o.name + CHAR(10)
FROM sysobjects o,sysindexes i 
WHERE 
(
    o.type = 'U'
    and o.id = i.id
    and i.indid in (0,1)
    and i.rows = 0
)order by o.name
PRINT @sql

您也可以使用此查询:

DECLARE @SQL NVARCHAR(MAX) = N'';
SELECT @SQL = @SQL + N'IF OBJECT_ID('''+ t.name + ''') > 0 DROP TABLE ' + t.name + CHAR(10)
FROM sys.tables t
    INNER JOIN sys.partitions p
        ON t.object_id = p.object_id
WHERE t.name NOT LIKE 'dt%'
      AND t.is_ms_shipped = 0
      AND p.rows = 0
GROUP BY t.name,
         p.rows
ORDER BY t.name;
IF @SQL <> ''
  EXEC sp_executesql @SQL

这将为所有没有记录的表生成脚本,然后执行该脚本。