Bagikan melalui


Kolom dengan nama

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Berikut ini adalah kondisi spesifik di mana kolom set baris dengan nama dipetakan, peka huruf besar/kecil, ke XML yang dihasilkan:

  • Nama kolom dimulai dengan tanda (@).

  • Nama kolom tidak dimulai dengan tanda (@).

  • Nama kolom tidak dimulai dengan tanda saat (@) dan berisi tanda garis miring (/).

  • Beberapa kolom berbagi awalan yang sama.

  • Satu kolom memiliki nama yang berbeda.

Nama kolom dimulai dengan tanda (@)

Jika nama kolom dimulai dengan tanda (@) dan tidak berisi tanda garis miring (/), atribut row elemen yang memiliki nilai kolom yang sesuai dibuat. Misalnya, kueri berikut mengembalikan set baris dua kolom (@PmId, Name). Dalam XML yang PmId dihasilkan, atribut ditambahkan ke elemen yang row sesuai dan nilai ProductModelID ditetapkan untuk itu.

SELECT ProductModelID as "@PmId",
       Name
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH;

Ini adalah hasilnya:

<row PmId="7">
  <Name>HL Touring Frame</Name>
</row>

Atribut harus datang sebelum jenis node lain, seperti node elemen dan node teks, dalam tingkat yang sama. Kueri berikut akan mengembalikan kesalahan:

SELECT Name,
       ProductModelID as "@PmId"
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH;

Nama kolom tidak dimulai dengan tanda (@)

Jika nama kolom tidak dimulai dengan tanda (@), bukan salah satu pengujian simpul XPath, dan tidak berisi tanda garis miring (/), elemen XML yang merupakan subelemen elemen baris, row secara default, dibuat.

Kueri berikut menentukan nama kolom, hasilnya. Oleh karena itu, result anak elemen ditambahkan ke row elemen .

SELECT 2 + 2 as result
for xml PATH;

Ini adalah hasilnya:

<row>
  <result>4</result>
</row>

Kueri berikut menentukan nama kolom, ManuWorkCenterInformation, untuk XML yang dikembalikan oleh XQuery yang ditentukan terhadap Instructions kolom jenis xml . Oleh karena itu, ManuWorkCenterInformation elemen ditambahkan sebagai turunan dari row elemen .

SELECT
  ProductModelID,
  Name,
  Instructions.query(
    'declare namespace MI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
     /MI:root/MI:Location
    ') as ManuWorkCenterInformation
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH;

Ini adalah hasilnya:

<row>
  <ProductModelID>7</ProductModelID>
  <Name>HL Touring Frame</Name>
  <ManuWorkCenterInformation>
    <MI:Location ...LocationID="10" ...></MI:Location>
    <MI:Location ...LocationID="20" ...></MI:Location>
     ...
  </ManuWorkCenterInformation>
</row>

Nama kolom tidak dimulai dengan tanda (@) dan berisi tanda garis miring (/)

Jika nama kolom tidak dimulai dengan tanda (@), tetapi berisi tanda garis miring (/), nama kolom menunjukkan hierarki XML. Misalnya, jika nama kolom adalah "Name1/Name2/Name3.../Namen", setiap Namai mewakili nama elemen yang ditumpuk dalam elemen baris saat ini (untuk i = 1) atau yang berada di bawah elemen yang memiliki nama Namai-1. Jika Naman dimulai dengan @, nama dipetakan ke atribut elemen Naman-1 .

Misalnya, kueri berikut mengembalikan ID dan nama karyawan yang direpresentasikan sebagai elemen EmpName kompleks yang berisi Firstnama , Middle, dan Last .

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;

Nama kolom digunakan sebagai jalur dalam membangun XML dalam mode PATH. Nama kolom yang berisi nilai ID karyawan, dimulai dengan '@'. Oleh karena itu, atribut, EmpID, ditambahkan ke row elemen . Semua kolom lainnya menyertakan tanda garis miring (/) dalam nama kolom yang menunjukkan hierarki. XML yang dihasilkan akan memiliki EmpName anak di bawah row elemen , dan EmpName anak akan memiliki First, Middle dan Last elemen turunan.

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
    <Last>Achong</Last>
  </EmpName>
</row>

Nama tengah karyawan null dan, secara default, nilai null memetakan ke tidak adanya elemen atau atribut. Jika Anda ingin elemen yang dihasilkan untuk nilai NULL, Anda dapat menentukan arahan ELEMENTS dengan XSINIL seperti yang ditunjukkan dalam kueri ini.

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;

Ini adalah hasilnya:

<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>

Secara default, mode PATH menghasilkan XML yang bersentrik elemen. Oleh karena itu, menentukan arahan ELEMENTS dalam kueri mode PATH tidak berpengaruh. Namun, seperti yang ditunjukkan pada contoh sebelumnya, arahan ELEMENTS berguna dengan XSINIL untuk menghasilkan elemen untuk nilai null.

Selain ID dan nama, kueri berikut mengambil alamat karyawan. Sesuai jalur dalam nama kolom untuk kolom alamat, Address elemen anak ditambahkan ke row elemen dan detail alamat ditambahkan sebagai turunan elemen elemen 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;

Ini adalah hasilnya:

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
    <Last>Achong</Last>
  </EmpName>
  <Address>
    <AddrLine1>7726 Driftwood Drive</AddrLine1>
    <City>Monroe</City>
  </Address>
</row>

Beberapa kolom berbagi awalan jalur yang sama

Jika beberapa kolom berikutnya berbagi awalan jalur yang sama, kolom tersebut dikelompokkan bersama dengan nama yang sama. Jika awalan namespace yang berbeda digunakan bahkan jika terikat ke namespace yang sama, jalur dianggap berbeda. Di kueri sebelumnya, FirstNamekolom , MiddleName, dan LastName memiliki awalan yang sama EmpName . Oleh karena itu, mereka ditambahkan sebagai anak-anak dari EmpName elemen . Ini juga terjadi ketika Anda membuat Address elemen dalam contoh sebelumnya.

Satu kolom memiliki nama yang berbeda

Jika kolom dengan nama yang berbeda muncul di antaranya, kolom tersebut akan merusak pengelompokan, seperti yang diperlihatkan dalam kueri yang dimodifikasi berikut ini. Kueri memutus pengelompokan FirstName, , MiddleNamedan LastName, seperti yang ditentukan dalam kueri sebelumnya, dengan menambahkan kolom alamat di antara FirstName kolom dan MiddleName .

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;

Akibatnya, kueri membuat dua EmpName elemen. Elemen pertama EmpName memiliki FirstName elemen anak dan elemen kedua EmpName memiliki MiddleName elemen dan LastName elemen anak.

Ini adalah hasilnya:

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
  </EmpName>
  <Address>
    <AddrLine1>7726 Driftwood Drive</AddrLine1>
    <City>Monroe</City>
  </Address>
  <EmpName>
    <Last>Achong</Last>
  </EmpName>
</row>

Lihat juga