Invoke-Sqlcmd 在某些数据库上查询@@IDLE 或@@IO_BUSY 失败

Query on @@IDLE or @@IO_BUSY fails on some databases from Invoke-Sqlcmd

运行 在查询@@IDLE 或@@IO_BUSY 时,对多个数据库的相同查询有时会失败。它在 6 个数据库上工作,在 4 个数据库上失败。当使用-Verbose时,输出VERBOSE: Arithmetic overflow occurred.,但没有指示什么对象溢出。

PS C:\src\Modules> $Query
SELECT
    SERVERPROPERTY('ServerName') AS ServerName
    ,SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS ComputerNamePhysicalNetBIOS
    ,@@IDENTITY AS I_DENTITY
    ,@@IDLE AS I_DLE
    ,@@IO_BUSY AS I_O_BUSY
    ,@@MAX_PRECISION AS MAX_PRECISION
PS C:\src\Modules> $ServerInstance = 'DBSERVER1'
PS C:\src\Modules> Invoke-Sqlcmd -Query $Query -ServerInstance $ServerInstance -Verbose

ServerName                  : DBSESRVER1
ComputerNamePhysicalNetBIOS : DGEDW284
I_DENTITY                   :
I_DLE                       : -869467476
I_O_BUSY                    : 1767922
MAX_PRECISION               : 38


PS C:\src\Modules> $ServerInstance = 'DBSERVER2'
PS C:\src\Modules> Invoke-Sqlcmd -Query $Query -ServerInstance $ServerInstance -Verbose
PS C:\src\Modules>

使用的代码在失败的数据库上将 $Results 设置为 $null。

try {
    $Results = Invoke-Sqlcmd -Query $Query `
        -ServerInstance $Instance `
        -ErrorAction SilentlyContinue
    if ($null -ne $Results) {
        foreach ($Result in $Results) {
            $result | Add-Member -NotePropertyName instance -NotePropertyValue $Instance
            $ResultList += $result
        }
    } else {
        Write-Verbose "Results is set to `$null for instance $Instance"
    }
}
catch {
    Write-Verbose "in catch"
}

Known bug on @@IO_BUSY

为后代从文档复制的注释 - 如果在@@CPU_BUSY 或@@IO_BUSY 中返回的时间超过大约 49 天的累积 CPU 时间,您将收到算术溢出警告。在那种情况下,@@CPU_BUSY、@@IO_BUSY 和@@IDLE 变量的值不准确。