【问题标题】:SQL query to delete all rows from tables where the table name contains a certain stringSQL查询从表中删除表名包含特定字符串的所有行
【发布时间】:2017-09-17 17:04:37
【问题描述】:

我有一个包含许多表的数据库,其中许多表的名称包含字母“PMO”。我希望能够从名称包含字符串“PMO”的所有表中删除所有行。因此,例如,从表“PMOThing”和“PMOOtherThing”中删除,而不是从表“Thing”或“OtherThing”中删除。

编辑

有人建议有一个重复的问题。它很接近,但并不完全。问题是如何删除名称包含某个字符串的表。我不想放弃这些表;我想从中删除所有行,但保留表格。如果有人知道如何修改下面的代码(来自建议的重复问题)来做我想做的事,那就太酷了!

DECLARE @cmd varchar(4000)
DECLARE cmds CURSOR FOR
SELECT 'drop table [' + Table_Name + ']'
FROM INFORMATION_SCHEMA.TABLES
WHERE Table_Name LIKE 'prefix%'

OPEN cmds
WHILE 1 = 1
BEGIN
    FETCH cmds INTO @cmd
    IF @@fetch_status != 0 BREAK
    EXEC(@cmd)
END
CLOSE cmds;
DEALLOCATE cmds

【问题讨论】:

  • 听起来和这个StackOverflow question类似
  • 别这样,太危险了!您将构建一个很酷的小脚本,它将解决您的所有问题并将其设置为数据库作业并忘记它,直到有一天,在您忘记它很久之后(或者可能在您离开之后),有人会来创建一个名为“TOPMOST_EARNERS”的表,当他们发现您的脚本已将其清除时,您将受到诅咒。编写一个脚本,专门列出要被截断的表,有人必须不时观察一下以维护和验证作为双重检查。
  • 感谢大家的帮助!

标签: sql-server


【解决方案1】:

将其剪切/粘贴到您的查询窗口中

select 'truncate table ' + quotename(OBJECT_SCHEMA_NAME(object_id)) + '.' + quotename(name)
from sys.tables
where name like '%PMO%'
order by name;

如果您希望自动执行此操作,则将管道结果放入表中,并循环遍历表,逐个执行 TSQL。

【讨论】:

  • 这样做让您有机会在运行之前查看脚本。我建议按名称订购,这样会更容易一些。
【解决方案2】:

因此,在结合可能重复问题的代码和 Greg 的答案后,效果最好的结果如下:

DECLARE @cmd varchar(4000)
DECLARE cmds CURSOR FOR
SELECT 'truncate table ' + quotename(OBJECT_SCHEMA_NAME(object_id)) + '.' + 
quotename(name)
FROM sys.tables
WHERE name like '%PMO%'
ORDER BY name;

OPEN cmds
WHILE 1 = 1
BEGIN
    FETCH cmds INTO @cmd
    IF @@fetch_status != 0 BREAK
    EXEC(@cmd)
END
CLOSE cmds;
DEALLOCATE cmds

感谢大家的帮助!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多