• Actually remove code "SELECT

    ???? @SQLServerCPU = SQLServerCPU,

    ???? @ServerCPU = ServerCPU

    FROM Util.dbo.GetCPUUsage(1)", it's redundant. See below.

    [font="Courier New"]USE [master]

    GO

    IF OBJECT_ID('dbo.sp_SysMon') IS NULL

    EXEC('CREATE PROCEDURE dbo.sp_SysMon AS SELECT 1 AS ID')

    GO

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    ALTER PROCEDURE dbo.sp_SysMon

    AS

    SET NOCOUNT ON

    SET ANSI_WARNINGS OFF

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    DECLARE @BatchRequestsPerSecond BIGINT,

    @CompilationsPerSecond BIGINT,

    @ReCompilationsPerSecond BIGINT,

    @LockWaitsPerSecond BIGINT,

    @PageSplitsPerSecond BIGINT,

    @CheckpointPagesPerSecond BIGINT,

    @stat_date DATETIME,

    @MachineName VARCHAR(128) = CAST(SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS VARCHAR(128)),

    @SQLServerCPU TINYINT,

    @ServerCPU TINYINT

    DECLARE @ServicePath NVARCHAR(156) = N'SYSTEM\CurrentControlSet\Services\' + CASE WHEN @@SERVICENAME = 'MSSQLSERVER' THEN 'MSSQLSERVER'

    ELSE 'MSSQL$' + @@SERVICENAME

    END,

    @MSSQLServiceAccountName VARCHAR(250)

    EXECUTE master.dbo.xp_instance_regread

    N'HKEY_LOCAL_MACHINE',

    @ServicePath,

    N'ObjectName',

    @MSSQLServiceAccountName OUTPUT,

    N'no_output'

    SET ANSI_WARNINGS OFF

    SELECT @stat_date = GETDATE(),

    @BatchRequestsPerSecond = MAX(CASE WHEN counter_name = 'Batch Requests/sec'

    AND object_name LIKE '%SQL Statistics%' THEN cntr_value

    END),

    @CompilationsPerSecond = MAX(CASE WHEN counter_name = 'SQL Compilations/sec'

    AND object_name LIKE '%SQL Statistics%' THEN cntr_value

    END),

    @ReCompilationsPerSecond = MAX(CASE WHEN counter_name = 'SQL Re-Compilations/sec'

    AND object_name LIKE '%SQL Statistics%' THEN cntr_value

    END),

    @LockWaitsPerSecond = MAX(CASE WHEN counter_name = 'Lock Waits/sec'

    AND object_name LIKE '%Locks%'

    AND instance_name = '_Total' THEN cntr_value

    END),

    @PageSplitsPerSecond = MAX(CASE WHEN counter_name = 'Page Splits/sec'

    AND object_name LIKE '%Access Methods%' THEN cntr_value

    END),

    @CheckpointPagesPerSecond = MAX(CASE WHEN counter_name = 'Checkpoint Pages/sec'

    AND object_name LIKE '%Buffer Manager%' THEN cntr_value

    END)

    FROM sys.dm_os_performance_counters AS a (NOLOCK)

    WHERE (counter_name = 'Batch Requests/sec'

    AND object_name LIKE '%SQL Statistics%')

    OR (counter_name = 'SQL Compilations/sec'

    AND object_name LIKE '%SQL Statistics%')

    OR (counter_name = 'SQL Re-Compilations/sec'

    AND object_name LIKE '%SQL Statistics%')

    OR (counter_name = 'Lock Waits/sec'

    AND object_name LIKE '%Locks%'

    AND instance_name = '_Total')

    OR (counter_name = 'Page Splits/sec'

    AND object_name LIKE '%Access Methods%')

    OR (counter_name = 'Checkpoint Pages/sec'

    AND object_name LIKE '%Buffer Manager%')

    WAITFOR DELAY '00:00:01'

    SET ANSI_WARNINGS ON

    SELECT TOP (1)

    @SQLServerCPU = SQLProcessUtilization,

    @ServerCPU = 100 - SystemIdle

    FROM (SELECT TOP 1 cpu_ticks / cpu_ticks / ms_ticks AS ts_now FROM sys.dm_os_sys_info (NOLOCK)) AS a

    CROSS JOIN sys.dm_os_ring_buffers(NOLOCK)

    CROSS APPLY (SELECT CAST( record AS XML)AS rXML) AS rx

    CROSS APPLY (SELECT XmlInfo.Record.value('(./@id)[1]', 'int') AS record_id,

    XmlInfo.Record.value('(./SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle,

    XmlInfo.Record.value('(./SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization

    FROM rXML.nodes('./Record') AS XmlInfo (Record)) AS nd

    WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'

    AND record LIKE '%<SystemHealth>%'

    ORDER BY timestamp DESC

    SET ANSI_WARNINGS OFF ;

    WITH dd

    AS (SELECT [Batch Requests/sec] = MAX(CASE WHEN counter_name = 'Batch Requests/sec'

    AND object_name LIKE '%SQL Statistics%' THEN cntr_value

    END),

    [SQL Compilations/sec] = MAX(CASE WHEN counter_name = 'SQL Compilations/sec'

    AND object_name LIKE '%SQL Statistics%' THEN cntr_value

    END),

    [SQL Re-Compilations/sec] = MAX(CASE WHEN counter_name = 'SQL Re-Compilations/sec'

    AND object_name LIKE '%SQL Statistics%' THEN cntr_value

    END),

    [Lock Waits/sec] = MAX(CASE WHEN counter_name = 'Lock Waits/sec'

    AND object_name LIKE '%Locks%'

    AND instance_name = '_Total' THEN cntr_value

    END),

    [Page Splits/sec] = MAX(CASE WHEN counter_name = 'Page Splits/sec'

    AND object_name LIKE '%Access Methods%' THEN cntr_value

    END),

    [Checkpoint Pages/sec] = MAX(CASE WHEN counter_name = 'Checkpoint Pages/sec'

    AND object_name LIKE '%Buffer Manager%' THEN cntr_value

    END),

    PageLifeExpectency = MAX(CASE WHEN counter_name = 'Page life expectancy'

    AND object_name LIKE '%Buffer Manager%' THEN cntr_value

    END),

    [Buffer cache hit ratio] = MAX(CASE WHEN counter_name = 'Buffer cache hit ratio'

    AND object_name LIKE '%Buffer Manager%' THEN cntr_value

    END),

    [Buffer cache hit ratio base] = MAX(CASE WHEN counter_name = 'Buffer cache hit ratio base'

    AND object_name LIKE '%Buffer Manager%' THEN cntr_value

    END),

    [Target Server Memory (MB)] = MAX(CASE WHEN counter_name = 'Target Server Memory (KB)'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END) / 1024.0,

    [Total Server Memory (MB)] = MAX(CASE WHEN counter_name = 'Total Server Memory (KB)'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END) / 1024.0,

    [Connection Memory (MB)] = MAX(CASE WHEN counter_name = 'Connection Memory (KB)'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END) / 1024.0,

    [Granted Workspace Memory (MB)] = MAX(CASE WHEN counter_name = 'Granted Workspace Memory (KB)'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END) / 1024.0,

    [Lock Memory (MB)] = MAX(CASE WHEN counter_name = 'Lock Memory (KB)'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END) / 1024.0,

    [Maximum Workspace Memory (MB)] = MAX(CASE WHEN counter_name = 'Maximum Workspace Memory (KB)'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END) / 1024.0,

    [Memory Grants Outstanding] = MAX(CASE WHEN counter_name = 'Memory Grants Outstanding'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END),

    [Memory Grants Pending] = MAX(CASE WHEN counter_name = 'Memory Grants Pending'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END),

    [Optimizer Memory (MB)] = MAX(CASE WHEN counter_name = 'Optimizer Memory (KB)'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END) / 1024.0,

    [SQL Cache Memory (MB)] = MAX(CASE WHEN counter_name = 'SQL Cache Memory (KB)'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END) / 1024.0,

    [User Connections] = MAX(CASE WHEN counter_name = 'User Connections'

    AND object_name LIKE '%General Statistics%' THEN cntr_value

    END),

    [Processes blocked] = MAX(CASE WHEN counter_name = 'Processes blocked'

    AND object_name LIKE '%General Statistics%' THEN cntr_value

    END),

    [Lock Blocks Allocated] = MAX(CASE WHEN counter_name = 'Lock Blocks Allocated'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END),

    [Lock Owner Blocks Allocated] = MAX(CASE WHEN counter_name = 'Lock Owner Blocks Allocated'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END),

    [Lock Blocks] = MAX(CASE WHEN counter_name = 'Lock Blocks'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END),

    [Lock Owner Blocks] = MAX(CASE WHEN counter_name = 'Lock Owner Blocks'

    AND object_name LIKE '%:Memory Manager%' THEN cntr_value

    END)

    FROM sys.dm_os_performance_counters AS a (NOLOCK)

    WHERE (counter_name = 'Batch Requests/sec'

    AND object_name LIKE '%SQL Statistics%')

    OR (counter_name = 'SQL Compilations/sec'

    AND object_name LIKE '%SQL Statistics%')

    OR (counter_name = 'SQL Re-Compilations/sec'

    AND object_name LIKE '%SQL Statistics%')

    OR (counter_name = 'Lock Waits/sec'

    AND object_name LIKE '%Locks%'

    AND instance_name = '_Total')

    OR (counter_name = 'Page Splits/sec'

    AND object_name LIKE '%Access Methods%')

    OR (counter_name = 'Checkpoint Pages/sec'

    AND object_name LIKE '%Buffer Manager%')

    OR (counter_name = 'Page life expectancy'

    AND object_name LIKE '%Buffer Manager%')

    OR (counter_name = 'Buffer cache hit ratio'

    AND object_name LIKE '%Buffer Manager%')

    OR (counter_name = 'Buffer cache hit ratio base'

    AND object_name LIKE '%Buffer Manager%')

    OR (counter_name = 'Target Server Memory (KB)'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Total Server Memory (KB)'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Connection Memory (KB)'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Granted Workspace Memory (KB)'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Lock Memory (KB)'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Maximum Workspace Memory (KB)'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Memory Grants Outstanding'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Memory Grants Pending'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Optimizer Memory (KB)'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'SQL Cache Memory (KB)'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'User Connections'

    AND object_name LIKE '%General Statistics%')

    OR (counter_name = 'Processes blocked'

    AND object_name LIKE '%General Statistics%')

    OR (counter_name = 'Lock Blocks Allocated'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Lock Owner Blocks Allocated'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Lock Blocks'

    AND object_name LIKE '%:Memory Manager%')

    OR (counter_name = 'Lock Owner Blocks'

    AND object_name LIKE '%:Memory Manager%')),

    rr

    AS (SELECT GETDATE() AS StatDate,

    @@SERVERNAME AS ServerName,

    @MachineName AS MachineName,

    @SQLServerCPU AS SQLServerCPU,

    @ServerCPU AS ServerCPU,

    [Buffer cache hit ratio] * 1.0 / [Buffer cache hit ratio base] * 100.0 AS BufferCacheHitRatio,

    PageLifeExpectency,

    CAST([Total Server Memory (MB)] / 4096 * 300 AS INT) AS PLEThreshold,

    m.available_physical_memory_kb / 1024 AS AvailablePhysicalMemoryMB,

    m.total_physical_memory_kb / 1024 AS TotalPhysicalMemoryMB,

    [Total Server Memory (MB)] AS TotalServerMemoryMB,

    [Target Server Memory (MB)] AS TargetServerMemoryMB,

    ([Batch Requests/sec] - @BatchRequestsPerSecond) / SecondsDiff AS BatchRequestsPerSecond,

    ([SQL Compilations/sec] - @CompilationsPerSecond) / SecondsDiff AS CompilationsPerSecond,

    ([SQL Re-Compilations/sec] - @ReCompilationsPerSecond) / SecondsDiff AS ReCompilationsPerSecond,

    ([Lock Waits/sec] - @LockWaitsPerSecond) / SecondsDiff AS LockWaitsPerSecond,

    ([Page Splits/sec] - @PageSplitsPerSecond) / SecondsDiff AS PageSplitsPerSecond,

    ([Checkpoint Pages/sec] - @CheckpointPagesPerSecond) / SecondsDiff AS CheckpointPagesPerSecond,

    [Connection Memory (MB)] AS ConnectionMemoryMB,

    [Granted Workspace Memory (MB)] AS GrantedWorkspaceMemoryMB,

    [Lock Memory (MB)] AS LockMemoryMB,

    [Maximum Workspace Memory (MB)] AS MaximumWorkspaceMemoryMB,

    [Memory Grants Outstanding] AS MemoryGrantsOutstanding,

    [Memory Grants Pending] AS MemoryGrantsPending,

    [Optimizer Memory (MB)] AS OptimizerMemoryMB,

    [SQL Cache Memory (MB)] AS SQLCacheMemoryMB,

    [Processes blocked] AS Processesblocked,

    [Lock Blocks Allocated] AS LockBlocksAllocated,

    [Lock Owner Blocks Allocated] AS LockOwnerBlocksAllocated,

    [Lock Blocks] AS LockBlocks,

    [Lock Owner Blocks] AS LockOwnerBlocks,

    [User Connections] AS UserConnections,

    pr.Sessions,

    pr.ServiceAccountSessions,

    pr.UserAccountSessions,

    pr.BlockingSessions,

    pr.BlockedSessions,

    pr.DormantSessions,

    pr.RunningSessions,

    pr.BackgroundSessions,

    pr.RollbackSessions,

    pr.PendingSessions,

    pr.RunnableSessions,

    pr.SpinloopSessions,

    pr.SuspendedSessions,

    pr.ServerStartTime

    FROM dd

    CROSS JOIN (SELECT DATEDIFF (millisecond, @stat_date, GETDATE ()) / 1000.0 AS SecondsDiff) AS sd

    CROSS JOIN sys.dm_os_sys_memory AS m (NOLOCK)

    CROSS JOIN (SELECT COUNT(DISTINCT spid) AS Sessions,

    COUNT(DISTINCT CASE WHEN loginame = @MSSQLServiceAccountName THEN spid

    END) AS ServiceAccountSessions,

    COUNT(DISTINCT CASE WHEN loginame NOT IN ('', 'sa', @MSSQLServiceAccountName) THEN spid

    END) AS UserAccountSessions,

    COUNT(DISTINCT NULLIF(blocked, 0)) AS BlockingSessions,

    COUNT(DISTINCT CASE WHEN blocked > 0 THEN spid

    END) AS BlockedSessions,

    COUNT(DISTINCT CASE WHEN STATUS = 'dormant' THEN SPID

    END) AS DormantSessions,

    COUNT(DISTINCT CASE WHEN STATUS = 'running' THEN SPID

    END) AS RunningSessions,

    COUNT(DISTINCT CASE WHEN STATUS = 'background' THEN SPID

    END) AS BackgroundSessions,

    COUNT(DISTINCT CASE WHEN STATUS = 'rollback' THEN SPID

    END) AS RollbackSessions,

    COUNT(DISTINCT CASE WHEN STATUS = 'pending' THEN SPID

    END) AS PendingSessions,

    COUNT(DISTINCT CASE WHEN STATUS = 'runnable' THEN SPID

    END) AS RunnableSessions,

    COUNT(DISTINCT CASE WHEN STATUS = 'spinloop' THEN SPID

    END) AS SpinloopSessions,

    COUNT(DISTINCT CASE WHEN STATUS = 'suspended' THEN SPID

    END) AS SuspendedSessions,

    MIN(login_time) AS ServerStartTime

    FROM master.sys.sysprocesses(NOLOCK)) AS pr)

    SELECT StatDate,

    ServerName AS SQLServerName,

    MachineName,

    SQLServerCPU,

    ServerCPU,

    PageLifeExpectency,

    PLEThreshold,

    CAST(CASE WHEN PageLifeExpectency > PLEThreshold * 100 THEN NULL

    WHEN PLEThreshold <> 0 THEN PageLifeExpectency * 100.0 / PLEThreshold

    ELSE 0

    END AS NUMERIC(6, 2)) AS [PLE%],

    BufferCacheHitRatio,

    AvailablePhysicalMemoryMB,

    TotalPhysicalMemoryMB,

    TotalServerMemoryMB,

    TargetServerMemoryMB,

    ConnectionMemoryMB,

    GrantedWorkspaceMemoryMB,

    LockMemoryMB,

    MaximumWorkspaceMemoryMB,

    OptimizerMemoryMB,

    SQLCacheMemoryMB,

    MemoryGrantsOutstanding,

    MemoryGrantsPending,

    BatchRequestsPerSecond,

    CompilationsPerSecond,

    ReCompilationsPerSecond,

    LockWaitsPerSecond,

    PageSplitsPerSecond,

    CheckpointPagesPerSecond,

    LockBlocks,

    LockBlocksAllocated,

    LockOwnerBlocks,

    LockOwnerBlocksAllocated,

    Processesblocked,

    BlockingSessions,

    BlockedSessions,

    UserConnections,

    Sessions,

    ServiceAccountSessions,

    UserAccountSessions,

    DormantSessions,

    RunningSessions,

    BackgroundSessions,

    RollbackSessions,

    PendingSessions,

    RunnableSessions,

    SpinloopSessions,

    SuspendedSessions,

    ServerStartTime,

    (SELECT ISNULL(CAST(NULLIF(DATEDIFF(HOUR, ServerStartTime, StatDate) / 24, 0) AS VARCHAR) + ' days ', '') + RIGHT('0'

    + CAST(DATEDIFF(MINUTE,

    StartDateTime,

    StatDate) / 60

    % 24 AS VARCHAR), 2) + ':'

    + RIGHT('0' + CAST(DATEDIFF(MINUTE, StartDateTime, StatDate) % 60 AS VARCHAR), 2) + ':' + RIGHT('0'

    + CAST(DATEDIFF(second, StartDateTime,

    StatDate) % 60 AS VARCHAR),

    2)

    FROM (SELECT DATEDIFF (DAY, ServerStartTime, StatDate)AS DayDiff) AS dd

    CROSS APPLY (SELECT CASE WHEN DayDiff > 1 THEN DATEADD(DAY, DayDiff - 1, ServerStartTime)

    ELSE ServerStartTime

    END AS StartDateTime) AS b) AS ServerUpTime

    FROM rr

    GO

    EXEC sys.sp_MS_marksystemobject

    sp_SysMon

    GO

    [/font]