在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),如何使它正常终止?
答案 0 :(得分:2)
我怀疑这里发生的事情是在IF
的实际评估之前进行语法检查。您需要为查询引入另一级别的“动态”。
EXEC sp_MSforeachdb
'IF DB_ID(''?'') > 4
BEGIN
EXEC (''ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [?]'' )
END'