代码之家  ›  专栏  ›  技术社区  ›  abarr

使用通配符删除SQL Server中的数据库

  •  4
  • abarr  · 技术社区  · 14 年前

    我有一个应用程序可以为每个新客户创建一个单独的数据库(SQL Server 2008),在测试过程中,我们最终得到了许多名为prefix的数据库。

    我希望有一个脚本可以查找所有以前缀开头的数据库。然后丢弃它们,这样我们就可以开始一个干净的测试循环。非常感谢您的帮助。

    3 回复  |  直到 6 年前
        1
  •  13
  •   Community basarat    7 年前
    SELECT ' DROP DATABASE [' + NAME + ']' FROM sys.sysdatabases where name like 'PREFIX%'
    

    复制输出并执行此操作以删除符合条件的数据库。你也可以每天安排这个,稍作调整。

        2
  •  4
  •   abarr    14 年前

    更新:

    我们最终扩大了巴约的答案,所以我想我会分享。我们从msbuild调用teh以下脚本,它将清除测试期间创建的所有teh现有db:

    use master
    
    DECLARE @Name nvarchar(1000);
    
    DECLARE testdb_cursor CURSOR FOR
    SELECT 'ALTER DATABASE' + '[' + NAME + ']' + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE    DROP DATABASE ' + '[' + NAME + ']' FROM sys.sysdatabases where name like 'TCM.%'
    
    OPEN testdb_cursor;
    
    -- Perform the first fetch and store the value in a variable.
    FETCH NEXT FROM testdb_cursor
    INTO @Name;
    
    -- Check @@FETCH_STATUS to see if there are any more rows to fetch.
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
       -- Concatenate and display the current values in the variables.
       exec sp_executesql @Name;
    
       -- This is executed as long as the previous fetch succeeds.
       FETCH NEXT FROM testdb_cursor
       INTO @Name;
       END
    
    CLOSE testdb_cursor;
    DEALLOCATE testdb_cursor;
    
        3
  •  0
  •   gregmac    6 年前

    只是遇到了这个问题,并提出了一个微小的变化,允许立即执行而不使用光标:

    DECLARE @SQL NVARCHAR(MAX) = ''
    SELECT @SQL = @SQL 
      + 'ALTER DATABASE [' + [name] + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; '
      + 'DROP DATABASE [' + [name] + ']; '
    FROM sys.databases 
    WHERE [name] like 'temp_%' AND create_date < DATEADD(day,-7,GETDATE())
    
    -- display statements 
    SELECT @SQL
    
    -- execute (uncomment)
    --EXEC sp_executesql @SQL 
    

    上面的内容是删除从开始的所有数据库 "temp_" 年龄超过7天,但这显然可以适应任何情况。

    危险: 弄乱查询,删除部分或全部数据库。我离开了 EXEC 语句注释掉了,只是为了避免有人通过复制/粘贴来执行此操作。