2014-10-30 88 views
0

我試圖選擇一個臨時表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 

回答

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 

這是(恕我直言)很多更具可讀性,更容易擴展/保持和原來是有很多更輕巧太(根據查詢計劃) 。

+0

完美謝謝你 – user2841861 2014-10-30 13:35:41

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' 
+0

使用IN回答爲什麼我會在表中得到兩行?我不僅應該有一行包含時間,未發送日誌,未被重新記錄的日誌和instance_name。提前致謝。 – user2841861 2014-10-30 12:19:27

+0

因爲你要求2行,你得到2行。一行涉及「日誌發送隊列KB」計數器,另一行涉及「重做隊列KB」計數器。如果你希望兩個行'組合',你可能想通過使用值的SUM()來進行聚合;在這種情況下,無論instance_name是否是(種類)常量,您還需要添加「GROUP BY instance_name」以獲取正確的語法。 – deroby 2014-10-30 12:37:09

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

非常感謝Dan的回答。 – user2841861 2014-10-30 13:36:31