在sql中删除没有行的表

时间:2015-02-05 11:11:16

标签: sql-server-2008 tsql stored-procedures

我写了这段代码:

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

请你帮我丢弃那些空桌子?

2 个答案:

答案 0 :(得分:3)

谨慎使用!

这将为您生成查询中所有表格的下拉脚本。当您打印变量@sql时,由于PRINT的限制,您只会看到其原始代码的前4000个字符声明。但是当你使用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

答案 1 :(得分:0)

您也可以使用此查询:

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

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