2017-08-08 36 views
0

在PowerShell中,我用下面的代碼刪除所有非系統SQL Server數據庫:SQL服務器:刪除所有數據庫除了系統的人

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:選項'SINGLE_USER'不能在數據庫'master'中設置。
選項'SINGLE_USER'不能在數據庫'tempdb'中設置。
在C:\ tmp目錄\ drop.ps1:19字符:5
+調用-SQLCMD -ServerInstance $ sqlInstanceName -U $ sqlUser -P $平方米...... + ~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ + CategoryInfo:InvalidOperation:(:) [調用-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?

如果只發現系統數據庫(master,model,msdb,tempdb),我該如何使它正常終止?

回答

2

我懷疑這裏發生了什麼事是在對IF進行實際評估之前的語法檢查。您需要爲您的查詢引入另一個「動態」級別。

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