0

VMware vCenter 5を使用していて、作成されたDRSルールのクイックレポートを作成したいと思います。以下はデータの抜粋です。

<obj xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:vim25" versionId="5.0" xsi:type="ArrayOfClusterRuleInfo">
  <ClusterRuleInfo xsi:type="ClusterAffinityRuleSpec">
    <key>1</key>
    <enabled>true</enabled>
    <name>SQL Servers</name>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-100</vm>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-200</vm>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-300</vm>
  </ClusterRuleInfo>
  <ClusterRuleInfo xsi:type="ClusterAntiAffinityRuleSpec">
    <key>2</key>
    <enabled>true</enabled>
    <name>Oracle DBs</name>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-1000</vm>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-2000</vm>
  </ClusterRuleInfo>
</obj>

ルールごとのVMの数は異なる場合があることに注意してください。

このXMLデータをテーブルに変換できなかったので、次のクエリを使用して(タグ内の)名前だけを見つけてみました。

SELECT ref.value('name[1]', 'varchar(200)') as [enabled]
FROM @data.nodes('/obj/ClusterRuleInfo') data( ref )

データを返しません。と行を削除すると機能することがわかりましたが、理由はわかりません。これは、SQL ServerがXMLスキーマを理解していないためだと思います(または同様のもの-私はXMLの専門家ではありません)。

最後に、次のような表を見たいと思います。

Name           VM
-----------   ----
SQL Servers    100
SQL Servers    200
SQL Servers    300
Oracle DBs    1000
Oracle DBs    2000
4

1 に答える 1

2

XMLは名前空間を使用するため、次のWITH XMLNAMESPACES句が必要です。

declare @data xml;
set @data = '
<obj xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:vim25" versionId="5.0" xsi:type="ArrayOfClusterRuleInfo">
  <ClusterRuleInfo xsi:type="ClusterAffinityRuleSpec">
    <key>1</key>
    <enabled>true</enabled>
    <name>SQL Servers</name>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-100</vm>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-200</vm>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-300</vm>
  </ClusterRuleInfo>
  <ClusterRuleInfo xsi:type="ClusterAntiAffinityRuleSpec">
    <key>2</key>
    <enabled>true</enabled>
    <name>Oracle DBs</name>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-1000</vm>
    <vm type="VirtualMachine" xsi:type="ManagedObjectReference">vm-2000</vm>
  </ClusterRuleInfo>
</obj>';

WITH XMLNAMESPACES('urn:vim25' AS ns)
SELECT 
  ref.value('../ns:name[1]','nvarchar(256)') AS Name, 
  STUFF(ref.value('.','nvarchar(256)'),1,3,'') AS VM
FROM @data.nodes('/ns:obj/ns:ClusterRuleInfo/ns:vm') data( ref );
于 2012-09-06T01:59:00.140 に答える