以下は、名前を持つ行セット列が結果の XML に大文字と小文字を区別してマップされる特定の条件です。
列名はアット マーク (@) で始まります。
列名はアット マーク (@) で始まらない。
列名は "@" では始まらず、スラッシュ (/) が含まれています。
複数の列が同じプレフィックスを共有します。
1 つの列の名前が異なります。
列名はアット マークで始まります (@)
列名がアットマーク (@) で始まり、スラッシュ (/) を含まない場合は、対応する列値を持つ <row> 要素の属性が作成されます。 たとえば、次のクエリでは、2 列 (@PmId、名前) 行セットが返されます。 結果の XML では、対応する <row> 要素に PmId 属性が追加され、ProductModelID の値が割り当てられます。
SELECT ProductModelID as "@PmId",
Name
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH
go
結果を次に示します。
<row PmId="7">
<Name>HL Touring Frame</Name>
</row>
属性は、要素ノードやテキスト ノードなど、他のノードタイプの前に同じレベルで存在する必要があることに注意してください。 次のクエリはエラーを返します。
SELECT Name,
ProductModelID as "@PmId"
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH
go
列名がアット マークで始まらない (@)
列名がアットマーク (@) で始まらない場合、XPath ノード テストの 1 つではなく、スラッシュ (/) を含まない場合は、既定で <row> 行要素のサブ要素である XML 要素が作成されます。
次のクエリでは、列名、結果を指定します。 したがって、 <result> 要素の子が <row> 要素に追加されます。
SELECT 2+2 as result
for xml PATH
結果を次に示します。
<row>
<result>4</result>
</row>
次のクエリでは、 XML 型の Instructions 列に対して指定された XQuery によって返される XML の列名 ManuWorkCenterInformation を指定します。 したがって、 <ManuWorkCenterInformation> 要素は、 <row> 要素の子として追加されます。
SELECT
ProductModelID,
Name,
Instructions.query('declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location
') as ManuWorkCenterInformation
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH
go
結果を次に示します。
<row>
<ProductModelID>7</ProductModelID>
<Name>HL Touring Frame</Name>
<ManuWorkCenterInformation>
<MI:Location ...LocationID="10" ...></MI:Location>
<MI:Location ...LocationID="20" ...></MI:Location>
...
</ManuWorkCenterInformation>
</row>
列名はアット マーク (@) で始まらず、スラッシュ (/) を含んでいます
列名がアットマーク (@) で始まらないが、スラッシュ (/) を含む場合、列名は XML 階層を示します。 たとえば、列名が "Name1/Name2/Name3.../Namen " の場合、各 Namei は、現在の行要素に入れ子になっている要素名 (i=1 の場合) または名前i-1 の要素の下にある要素名を表します。 名前n が '@' で始まる場合は、Namen-1 要素の属性にマップされます。
たとえば、次のクエリは、First、Middle、Last name を含む複合要素 EmpName として表される従業員 ID と名前を返します。
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.Employee E, Person.Contact C
WHERE E.EmployeeID = C.ContactID
AND E.EmployeeID=1
FOR XML PATH
列名は、PATH モードで XML を構築するパスとして使用されます。 従業員 ID 値を含む列名は、'@' で始まります。したがって、属性 EmpID が <row> 要素に追加されます。 他のすべての列には、階層を示す列名にスラッシュ ('/') が含まれています。 結果の XML は<row>要素の下に<EmpName>子を持ち、<EmpName>子には<First>、<Middle>、および<Last>要素の子が含まれます。
<row EmpID="1">
<EmpName>
<First>Gustavo</First>
<Last>Achong</Last>
</EmpName>
</row>
従業員のミドル ネームは null で、既定では null 値は要素または属性が存在しない場合にマップされます。 NULL 値に対して要素を生成する場合は、このクエリに示すように、XSINIL を使用して ELEMENTS ディレクティブを指定できます。
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.Employee E, Person.Contact C
WHERE E.EmployeeID = C.ContactID
AND E.EmployeeID=1
FOR XML PATH, ELEMENTS XSINIL
結果を次に示します。
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
EmpID="1">
<EmpName>
<First>Gustavo</First>
<Middle xsi:nil="true" />
<Last>Achong</Last>
</EmpName>
</row>
既定では、PATH モードでは要素中心の XML が生成されます。 そのため、PATH モードクエリで ELEMENTS ディレクティブを指定しても効果はありません。 ただし、前の例に示すように、ELEMENTS ディレクティブは XSINIL で null 値の要素を生成する場合に便利です。
ID と名前に加えて、次のクエリは従業員のアドレスを取得します。 アドレス列の列名のパスに従って、 <Address> 要素の子が <row> 要素に追加され、アドレスの詳細が <Address> 要素の要素の子として追加されます。
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last",
AddressLine1 "Address/AddrLine1",
AddressLine2 "Address/AddrLIne2",
City "Address/City"
FROM HumanResources.Employee E, Person.Contact C, Person.Address A
WHERE E.EmployeeID = C.ContactID
AND E.AddressID = A.AddressID
AND E.EmployeeID=1
FOR XML PATH
結果を次に示します。
<row EmpID="1">
<EmpName>
<First>Gustavo</First>
<Last>Achong</Last>
</EmpName>
<Address>
<AddrLine1>7726 Driftwood Drive</AddrLine1>
<City>Monroe</City>
</Address>
</row>
複数の列が同じパス プレフィックスを共有する
後続の複数の列が同じパス プレフィックスを共有する場合、それらは同じ名前でグループ化されます。 同じ名前空間にバインドされている場合でも、異なる名前空間プレフィックスが使用されている場合、パスは異なると見なされます。 前のクエリでは、FirstName、MiddleName、LastName の各列が同じ EmpName プレフィックスを共有しています。したがって、 <EmpName> 要素の子として追加されます。 これは、前の例で <Address> 要素を作成した場合にも当てはまる場合です。
1 つの列の名前が異なる
別の名前の列が間に表示される場合は、次の変更されたクエリに示すように、グループ化が解除されます。 このクエリは、FirstName 列と MiddleName 列の間にアドレス列を追加することで、前のクエリで指定した FirstName、MiddleName、LastName のグループ化を解除します。
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
AddressLine1 "Address/AddrLine1",
AddressLine2 "Address/AddrLIne2",
City "Address/City",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.EmployeeAddress E, Person.Contact C, Person.Address A
WHERE E.EmployeeID = C.ContactID
AND E.AddressID = A.AddressID
AND E.EmployeeID=1
FOR XML PATH
その結果、クエリによって 2 つの <EmpName> 要素が作成されます。 最初の <EmpName> 要素には <FirstName> 要素の子があり、2 番目の <EmpName> 要素には <MiddleName> と <LastName> 要素の子があります。
結果を次に示します。
<row EmpID="1">
<EmpName>
<First>Gustavo</First>
</EmpName>
<Address>
<AddrLine1>7726 Driftwood Drive</AddrLine1>
<City>Monroe</City>
</Address>
<EmpName>
<Last>Achong</Last>
</EmpName>
</row>