【问题标题】:SQL to delete tables that begins with common prefixSQL删除以公共前缀开头的表
【发布时间】:2019-08-13 06:13:48
【问题描述】:

我希望编写一个 SQL 查询/存储过程,该过程将删除数据库中以“table”之类的公共前缀开头的表。

但是,表的名称以前缀开头,后跟一个数字,如果我可以将表编号附加到前缀,我不想将它们全部删除。

谢谢

【问题讨论】:

  • 你能扩展一下'我不想全部删除'
  • 我不想删除所有包含前缀的表,因为它们有数百个,我想删除包含前缀和附加数字的表
  • 是否有规定哪些要删除,哪些要保留?

标签: mysql sql database


【解决方案1】:

看看这个: Get table names using SELECT statement in MySQL

您可以通过对表前缀的约束来连接该表

希望对您有所帮助并玩得开心

【讨论】:

    【解决方案2】:

    查找列如下的所有表:

    SELECT      c.name  AS 'ColumnName'
                ,t.name AS 'TableName'
    FROM        sys.columns c
    JOIN        sys.tables  t   ON c.object_id = t.object_id
    WHERE       c.name LIKE '%SubId%'
    ORDER BY    TableName
                ,ColumnName;
    

    查找表名如下的所有表:

    SELECT      c.name  AS 'ColumnName'
                ,t.name AS 'TableName'
    FROM        sys.columns c
    JOIN        sys.tables  t   ON c.object_id = t.object_id
    WHERE       t.name LIKE '%tbl%'
    ORDER BY    TableName
                ,ColumnName;
    

    查找特定架构中的所有表:

    SELECT t.name 
      FROM sys.tables AS t
      INNER JOIN sys.schemas AS s
      ON t.[schema_id] = s.[schema_id]
      WHERE s.name = N'cmc';
    

    一旦您有了需要删除的表,您就可以为每个表编写删除语句。或者你可以使用类似下面的东西:

    SELECT      c.name  AS 'ColumnName'
                ,t.name AS 'TableName',
                'drop table ' + t.name
    FROM        sys.columns c
    JOIN        sys.tables  t   ON c.object_id = t.object_id
    WHERE       t.name LIKE '%tbl%'
    ORDER BY    TableName
                ,ColumnName;
    

    编辑

    下面是一个关于 where 子句的更详细的选择:

    SELECT      c.name  AS 'ColumnName'
                ,t.name AS 'TableName'          
    FROM        sys.columns c
    JOIN        sys.tables  t   ON c.object_id = t.object_id
    WHERE       
                t.name LIKE 'tbl%' -- where the table name starts with the letters 'tbl'
                OR t.name LIKE 'tbl%123%' -- where the table name starts with the letters 'tbl' and has the numbers '123' in the table name
                OR c.name LIKE '%colName%' -- where a column has a name that contains the letters 'colName'
    
    ORDER BY    TableName
                ,ColumnName;
    

    【讨论】:

    • 如果我想使用它来查找表名但是过滤那些 ID 与我在其中一列中找到的指定 ID 匹配的表,这些将如何工作
    • 我不确定我是否完全理解你。如果对我的回答的编辑对您没有帮助,请澄清您的问题,但添加更多信息和您正在尝试做的示例。
    【解决方案3】:

    查找所有以您的前缀开头的表名,并创建动态删除查询并将结果插入到 temp 表中,如下所示:

    DECLARE @YourPrefix VARCHAR(MAX) = 'table'
    SELECT    
        'DROP TABLE ' + t.name AS DropQuery
    INTO #TMP
    FROM        
          sys.tables  t   
    WHERE
        t.name LIKE @YourPrefix + '%'
    

    在临时表上写cursor,并使用sp_executesql这样执行drop查询。

    DECLARE @Query NVARCHAR(MAX) = NULL
    DECLARE C CURSOR FOR
        SELECT 
            T.DropQuery 
        FROM 
            #TMP T
    OPEN C
    WHILE 1=1
    BEGIN
        FETCH NEXT FROM C INTO @Query
        IF @@FETCH_STATUS <> 0 BREAK;
        EXEC sp_executesql @Query
    END
    CLOSE C
    DEALLOCATE C
    

    它会删除所有以您的前缀开头的表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-25
      • 2010-12-08
      • 2018-07-21
      • 2020-02-10
      • 2016-02-20
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多