Powershell的Powershell DBCC CheckDB

时间:2013-02-19 15:40:55

标签: sql-server powershell sql-server-2005

我想知道是否有人可以帮助显示以下代码。我基本上试图让这些代码重新散列,如果可能的话,允许我针对名为“servers.txt”的文本文件中提供的一组服务器名称运行它。

DBCC应该由PS脚本运行,并针对该服务器名称的所有数据库运行。我没有足够的速度与PS来了解如何为此脚本执行此操作。

如何更改它允许插入值而不是为每个服务器名称进行硬编码?

我已经阅读了一下这个并查看了Invoke-Sql命令,我认为它是PS 2008的SQL 2008扩展。

不幸的是PS环境是来自SQL 2005的一个盒子而且我没有权力让它被移动所以不要认为生病了能够使用调用

请参阅原始代码,然后查看我的实验,尝试使用invoke运行它。

$ScriptName = $myInvocation.MyCommand.Name
[void][reflection.assembly]::LoadWithPartialName("System.Data.SqlClient")
$ConnString = "Server=DB-OCC05;Integrated Security=SSPI;Database=master;Application Name=$ScriptName"
$MasterConn = new-object ('System.Data.SqlClient.SqlConnection') $ConnString
$MasterCmd = new-object System.Data.SqlClient.SqlCommand 
$MasterCmd.Connection = $MasterConn
$SqlDBCC = "DBCC CHECKDB(master) WITH TABLERESULTS"
$MasterCmd.CommandText = $SqlDBCC
$MasterConn.Open()
$Rset = $MasterCmd.ExecuteReader()
If ($Rset.HasRows -eq $true) {
    While ($Rset.Read()) {
        $line = $Rset["MessageText"]
        If ($Rset["Level"] -gt 10) {
            Write-Host $line -backgroundcolor Yellow -foregroundcolor Red
        } else {
            Write-Host $line 
        }
    }
    $Rset.Close()
}
$MasterConn.Close() 

然后我的测试从SQL 2005环境运行:

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"

还尝试了这个测试:

gc "C:\Powershell\Servers.txt" | foreach-object {Invoke-Sqlcmd "DBCC checkdb;" -ServerInstance "$_\MyInstance"}

但是上面的测试运行并没有起作用:

  

术语“Invoke-Sqlcmd”未被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或路径。

1 个答案:

答案 0 :(得分:2)

对您的脚本进行一些修改。一切都基本相同,除了连接字符串和底部的几行用于加载servers.txt文件(每个实例一行文本文件)并枚举其内容:

function Execute-DBCC
{
    param (
        [parameter(Mandatory = $true)][string]$serverInstance
    )

    $connString = "Server=$serverInstance;Integrated Security=SSPI;Database=master;Application Name=$ScriptName"
    $masterConn = new-object ('System.Data.SqlClient.SqlConnection') $connString
    $masterCmd = new-object System.Data.SqlClient.SqlCommand 
    $masterCmd.Connection = $masterConn

    $masterCmd.CommandText = "EXECUTE master.sys.sp_MSforeachdb 'DBCC CHECKDB([?]) WITH TABLERESULTS'"
    $masterConn.Open()
    $reader = $masterCmd.ExecuteReader()

    if ($reader.HasRows -eq $true) 
    {
        while ($reader.Read()) 
        {
            $messageText = $reader["MessageText"]

            if ($reader["Level"] -gt 10) 
                { Write-Host $messageText -backgroundcolor Yellow -foregroundcolor Red  } 
            else 
                { Write-Host $messageText  }
        }

        $reader.Close()
    }

    $masterConn.Close() 
}




[void][reflection.assembly]::LoadWithPartialName("System.Data.SqlClient")

$servers = @(Get-Content ".\servers.txt")

$servers | %{
    Execute-DBCC $_
}