【问题标题】:How would a single script truncate a particular table in every database?单个脚本如何截断每个数据库中的特定表?
【发布时间】:2009-05-19 19:43:16
【问题描述】:

我有一个包含许多数据库的 Microsoft SQL Server 2008,其中大多数都有一个 Logs 表。我希望能够安排一个脚本来运行和截断每个数据库中的日志表(动态)。我想我必须获取每个用户数据库的名称,然后在包含 Logs 表的数据库中截断表 Logs。

我最终使用的语句是:

EXEC sp_MSForEachDB 'Use [?]; IF  EXISTS (SELECT * FROM sys.tables WHERE name = "Logs" and type="U")TRUNCATE TABLE Logs'

【问题讨论】:

  • SQL Server 的哪个版本(企业版、Express 版、标准版)?
  • 标准版 64 位,谢谢。

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


【解决方案1】:

这有点hack,因为存储过程没有记录,但试试这个:

EXEC sp_MSForEachDB 'Use ?; TRUNCATE TABLE Logs'

【讨论】:

  • 不是我,我还在测试中。
  • 这里有一个很好的例子来试试这个(如果你不想截断一个表): EXEC sp_MSForEachDB 'Use ?;打印 db_name()'
  • 蹒跚学步的老鼠综合症 :( 我最初将其视为您无法在 2008 年截断的事务日志,因此无法解决该问题。
  • 我认为问题在于并非每个数据库都包含正确的表。
  • 您可以在其周围添加一个“如果存在”保护。
【解决方案2】:

在 2008 年,如果它当时没有投入生产使用,那么最容易做的事情就是这样

编写一个在动态 sql 中执行此操作的脚本

Alter Database <mydb> set recovery simple
go

Checkpoint
go

Alter Database <mydb> set recovery full
go

【讨论】:

  • 我绝对应该选择一个不那么含糊的表名。
  • 他不是要截断事务日志,而是要截断一个名为 Logs 的表。
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2011-08-27
  • 2016-10-19
  • 1970-01-01
  • 2015-06-08
  • 2011-06-12
  • 2014-02-23
  • 1970-01-01
相关资源
最近更新 更多