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(某种程度上)是一个常量。