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

Sql server 如何在临时表中选择计数值,sql-server,tsql,select,Sql Server,Tsql,Select,我试图在临时表中为两个不同的计数器名称选择cntr\u值,其实例名称为\u 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

我试图在临时表中为两个不同的计数器名称选择
cntr\u值
,其
实例名称
\u 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 

您需要更改逻辑以使用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'
或者,使用在这种情况下更具可读性的:

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'

下面是使用
交叉应用
从两个不同行获取计数器值的示例

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';

我花了一段时间才明白你要去哪里。试图理解@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

它(IMHO)可读性更高,更易于扩展/维护,而且也更轻量级(根据查询计划)。

使用IN-answer,为什么表中有两行?我不应该只有一行包含时间、未发送日志、未存储日志和实例名称。提前谢谢。因为你要两行,所以你得到了两行。一行与
日志发送队列KB
计数器相关,另一行与
重做队列KB
计数器相关。如果要“组合”两行,可能需要对值使用
SUM()
进行聚合;在这种情况下,您还需要添加
groupbyinstance\u name
,以获得正确的语法,而不管在这种情况下instance\u name(某种程度上)是一个常量。