【问题标题】:Drop tables without rows in tsql删除sql中没有行的表
【发布时间】:2015-02-05 11:11:16
【问题描述】:

我写了这段代码:

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

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

【问题讨论】:

  • 问题出在哪里?删除这些表格的哪个部分对您来说很难?到目前为止,您尝试了哪些代码?
  • 感谢 SubqueryCrunch!我只是不知道如何在存储过程中迭代删除。
  • 一种简单、容易且低效的方法是使用光标。另一种选择是使用动态 sql 生成放置代码。
  • 警告任何考虑使用上述查询的人 - 它可以包括一个名为 dtproperties 的系统表,该表包含图表并且不被查询排除。您可以通过在 where 子句中包含 t.NAME NOT LIKE 'dt%' 来排除它,只要您没有任何以 DT 开头的表!

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


【解决方案1】:

谨慎使用!

这将为您的查询中的所有表生成一个删除脚本。当您打印变量@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

【讨论】:

  • 如果您的表名中包含连字符等特殊字符,则需要在 o.name 周围使用 [ ]。 - 删除表 [' + t.name + ']' + CHAR(10)
【解决方案2】:

你也可以使用这个查询:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多