如何在临时表中选择计数值

时间:2014-10-30 11:34:08

标签: sql-server tsql select

我尝试使用cntr_value instance_name为两个不同的计数器名称选择_Total临时表。我无法解决如何做到这一点。

INSERT INTO @RESULTS
        (AsOfDate, unsent_log, unrestored_log, instance_name) 
        select @Now, cntr_value, cntr_value, instance_name 
        from master.sys.dm_os_performance_counters 
        where counter_name ='Log Send Queue KB'
        --and counter_name = 'Redo Queue KB'
        and instance_name = '_Total'
        Select * from @results

我的表格如下:

AsOfDate                      unsent_log    unrestored_log  instance_name
2014-10-30 11:22:25.290        0                    0            _Total 

3 个答案:

答案 0 :(得分:1)

您需要更改逻辑以使用OR(因为名称是一个值或另一个值),并且由于优先规则将该子句包装在括号中:

INSERT INTO @RESULTS
    (AsOfDate, unsent_log, unrestored_log, instance_name) 
    select @Now, cntr_value, cntr_value, instance_name 
    from master.sys.dm_os_performance_counters 
    where (counter_name ='Log Send Queue KB' OR counter_name = 'Redo Queue KB')
    and instance_name = '_Total'

或者使用IN,在这种情况下更具可读性:

INSERT INTO @RESULTS
    (AsOfDate, unsent_log, unrestored_log, instance_name) 
    select @Now, cntr_value, cntr_value, instance_name 
    from master.sys.dm_os_performance_counters 
    where counter_name IN ('Log Send Queue KB', 'Redo Queue KB')
    and instance_name = '_Total'

答案 1 :(得分:0)

下面是使用CROSS APPLY从2个不同行获取计数器值的示例。

INSERT INTO @RESULTS
        ( AsOfDate
        , unsent_log
        , unrestored_log
        , instance_name
        )
        SELECT  SYSDATETIME() AS AsOfDate
              , a.cntr_value AS unsent_log
              , b.cntr_value AS unrestored_log
              , instance_name
        FROM    master.sys.dm_os_performance_counters AS a
                CROSS APPLY ( SELECT    cntr_value
                              FROM      master.sys.dm_os_performance_counters
                                        AS b
                              WHERE     b.counter_name = 'Log Send Queue KB'
                                        AND b.instance_name = '_Total'
                            ) AS b
        WHERE   a.counter_name = 'Redo Queue KB'
                AND a.instance_name = '_Total';

答案 2 :(得分:0)

我花了一段时间才明白你要去哪里。试图理解@ DanGuzman的回答让我走上了正轨,但我认为他的答案太复杂了,无法满足这里的需要。

我只是去找:

INSERT INTO @RESULTS (AsOfDate, unsent_log, unrestored_log, instance_name) 
SELECT @Now, 
       unsent_log = SUM(CASE WHEN counter_name = 'Log Send Queue KB' THEN cntr_value ELSE 0 END),
       unrestored_log = SUM(CASE WHEN counter_name = 'Redo Queue KB' THEN cntr_value ELSE 0 END),
       instance_name 
  FROM master.sys.dm_os_performance_counters 
 WHERE counter_name IN ('Log Send Queue KB', 'Redo Queue KB')
   AND instance_name = '_Total'
 GROUP BY instance_name

这是(恕我直言)更易读,更容易扩展/维护,并且结果也更轻量级(根据查询计划)。