2016-12-06 11 views
0

MSDBのsyscollector_collection_itemsテーブルからparameters列のXMLを照会しようとしています。DataCollectorの照会syscollector_collection_items XML

私は、次の表を照会するとき私の問題は、私は、

<cs> 
    <Parameters> 
    <ns:PerformanceCountersCollector xmlns:ns="DataCollectorType"> 
     <PerformanceCounters Objects="LogicalDisk" Counters="Avg. Disk sec/Read" Instances="_Total" /> 
     <PerformanceCounters Objects="LogicalDisk" Counters="Avg. Disk sec/Write" Instances="_Total" /> 
     <PerformanceCounters Objects="LogicalDisk" Counters="% Disk Time" Instances="_Total" /> 
    </ns:PerformanceCountersCollector> 
    </Parameters> 
</cs> 
<cs> 
    <Parameters> 
    <ns:PerformanceCountersCollector xmlns:ns="DataCollectorType"> 
     <PerformanceCounters Objects="Processor" Counters="% Processor Time" Instances="_Total" /> 
     <PerformanceCounters Objects="Processor" Counters="% Privileged Time" Instances="_Total" /> 
    </ns:PerformanceCountersCollector> 
    </Parameters> 
</cs> 

を、以下の結果を得た。しかし、私はちょうど「オブジェクト」と表などの「カウンター」をしたい、

select 
--ci.parameters.value('(.)[5]','varchar(100)') AS [Parameters], 
ci.parameters.query('(/)') AS [Parameters] 
FROM 
msdb.dbo.syscollector_collection_sets AS cs 
INNER JOIN msdb.dbo.syscollector_collection_items AS ci ON ci.collection_set_id=cs.collection_set_id 
INNER JOIN msdb.dbo.syscollector_collector_types AS ct ON ct.collector_type_uid = ci.collector_type_uid 
WHERE cs.is_system <> 1 
FOR XML AUTO 

です結果。例えば

:あなたはFOR XML AUTOを使用しないのはなぜ

Objects  | Counters 

LogicalDisk | Avg. Disk sec/Read 

LogicalDisk | Avg. Disk sec/Write 

LogicalDisk | % Disk Time 

Processor | % Processor Time 

Processor | % Privileged Time 

答えて

0

?これは、クエリの結果をXMLに変換します。私はこれを正しく読めば、あなたはXMLの外テーブルワイズデータを取得しようとしている...

はこのようにそれを試してみてください。

select perfCounter.value('@Objects','nvarchar(max)') AS Objects 
     ,perfCounter.value('@Counters','nvarchar(max)') AS Counters 
FROM 
msdb.dbo.syscollector_collection_sets AS cs 
INNER JOIN msdb.dbo.syscollector_collection_items AS ci ON ci.collection_set_id=cs.collection_set_id 
INNER JOIN msdb.dbo.syscollector_collector_types AS ct ON ct.collector_type_uid = ci.collector_type_uid 
CROSS APPLY parameters.nodes(N'/*:cs/*:Parameters/*:PerformanceCountersCollector') AS A(perfCounterCollector) 
CROSS APPLY perfCounterCollector.nodes(N'*:PerformanceCounters') AS B(perfCounter) 
WHERE cs.is_system <> 1 

あなたは認識しておく必要があり、この中のパラメータということテーブルは内容、形状、構造が非常に異なります。再び - - 階層 - - 取得するCROSS APPLYもう一つ、私が最初にリストに手を得るために.nodes()CROSS APPLYを使用して、いくつかの<PerformanceCounters> -elementesを含み、それらのそれぞれが中に、テーブルとして返さたいいくつかの<ns:PerformanceCountersCollector>要素があるので

2番目のリストあなたが必要とするのは、この2番目のリストから属性値です。

Btw:*:を使用して名前空間をワイルドカードしました。これを明示する必要があるかもしれません。何か問題がある場合は、ちょうど戻ってきてください...

+0

こんにちは@シュヌゴ、返信ありがとうございます。私はクエリを実行するが、結果を返さない、私は1つだけの要素と選択リターンが空白のデフォルトのコレクションを使用する場所を変更します。 – Leka

+0

@Leka喜んで助けて! Btw:それは助けましたか? – Shnugo

+0

あなたの答えは、そうでなければ問題を解決しようと私の心を開きましたが、私はまだ解決できません – Leka