【问题标题】:SQL Server : drop all databases except the system onesSQL Server:删除除系统数据库之外的所有数据库
【发布时间】:2018-01-15 17:45:04
【问题描述】:

在 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:无法在数据库“master”中设置选项“SINGLE_USER”。
无法在数据库“tempdb”中设置选项“SINGLE_USER”。
在 C:\tmp\drop.ps1:19 char:5
+ 调用-sqlcmd -ServerInstance $sqlInstanceName -U $sqlUser -P $sq ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

我以为IF DB_ID(''?'') > 4 会跳过任何系统数据库:

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

如果只找到系统数据库(master、model、msdb、tempdb),如何让它正常终止?

【问题讨论】:

    标签: sql-server powershell


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2013-09-19
      相关资源
      最近更新 更多