SQL Server:删除除系统

时间:2017-08-08 08:44:01

标签: sql-server powershell

在PowerShell中我使用以下代码删除所有非系统SQL Server数据库:

invoke-sqlcmd -ServerInstance $sqlInstanceName -U $sqlUser -P $sqlPass -Query "
EXEC sp_MSforeachdb
  'IF DB_ID(''?'') > 4
  BEGIN
    ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    DROP DATABASE [?]
  END'
"

它似乎做了这个工作。但当我重新运行时,我得到了:

  

invoke-sqlcmd:Option' SINGLE_USER'不能在数据库中设置' master'。
  选项' SINGLE_USER'无法在数据库' tempdb'中设置   在C:\ tmp \ drop.ps1:19 char:5
      + invoke-sqlcmd -ServerInstance $ sqlInstanceName -U $ sqlUser -P $ sq ...       + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~           + CategoryInfo:InvalidOperation:(:) [Invoke-Sqlcmd],SqlPowerShellSqlExecutionException           + FullyQualifiedErrorId:SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

我认为IF DB_ID(''?'') > 4会跳过任何系统dbs:

How can I omit system databases and allow SQL Server 2008 agent job to move past ERROR_NUMBER 208?

如果只找到系统dbs(master,model,msdb,tempdb),如何使它正常终止?

1 个答案:

答案 0 :(得分:2)

我怀疑这里发生的事情是在IF的实际评估之前进行语法检查。您需要为查询引入另一级别的“动态”。

EXEC sp_MSforeachdb
  'IF DB_ID(''?'') > 4
  BEGIN
    EXEC (''ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE [?]'' )
  END'