我正在编写一个针对 SCOM 2012 OperationsManager 数据库运行的查询。SQL 实例是 Microsoft SQL Server 2012 - 11.0.5058.0 (X64)。
数据库中有一个名为Monitors
. 数据库的模式可以在这里找到:链接到模式
我可以运行以下查询:
select monitorid, configurationxml
from dbo.monitor
where monitorid = '4960E39A-59C8-A2C2-99B1-59B73D73156F'
它返回这个:
monitorid configurationxml
4960E39A-59C8-A2C2-99B1-59B73D73156F <ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName><DiskLabel>$Target/Property[Type="Windows!Microsoft.Windows.LogicalDevice"]/DeviceID$</DiskLabel><CounterName>PercentFree</CounterName><IntervalSeconds>900</IntervalSeconds><NumSamples>4</NumSamples><SystemDriveWarningThreshold>10</SystemDriveWarningThreshold><SystemDriveErrorThreshold>5</SystemDriveErrorThreshold><NonSystemDriveWarningThreshold>10</NonSystemDriveWarningThreshold><NonSystemDriveErrorThreshold>5</NonSystemDriveErrorThreshold>
(因此列中的监视器 GUID 和 XMLconfigurationxml
然后我可以运行这个查询:
Select
D.C.value('IntervalSeconds[1]','varchar(4000)') CheckInterval,
D.C.value('NumSamples[1]','varchar(4000)') SamplesBeforeDown,
D.C.value('SystemDriveWarningThreshold[1]','varchar(4000)') SystemDriveWarningThreshold,
D.C.value('CounterName[1]','varchar(4000)') Countertype
FROM (Select n.c.query('.') as xmlquery
from
(Select cast(ConfigurationXML as xml) Recxml
FROM [dbo].[monitor] mt)
a Cross Apply Recxml.nodes('/') N(C)) r
Cross Apply xmlquery.nodes('/') D(C)
哪个碎片(不确定这是否是正确的术语)XML 并允许我针对该列检索特定元素值:
CheckInterval SamplesBeforeDown SystemDriveWarningThreshold Countertype
900 4 10 PercentFree
我遇到的问题是,我希望能够在该特定行中提取链接到 GUID 的特定元素值,这样我就可以获得我想要的 GUID 和 xpecific XML 元素值,如下所示:
monitorid CheckInterval SamplesBeforeDown SystemDriveWarningThreshold Countertype
4960E39A-59C8-A2C2-99B1-59B73D73156F 900 4 10 PercentFree
我遇到的主要问题是,当我粉碎 XML 时,它失去了对它来自的行的引用。
如何将 XML 内容链接到它来自的行?
尝试这个:
请注意,我已经对您的代码进行了一些更改:1) 始终使用
text()
访问器来针对无类型 XML 获得更好的性能,以及 2) 我已经指定了更好的数据类型。让我知道这是否适合你。