Gunakan metode value() dan node() dengan OPENXML

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database

Anda dapat menggunakan beberapa value() metode pada jenis data xml dalam klausa SELECT untuk menghasilkan kumpulan baris nilai yang diekstrak. Metode ini nodes() menghasilkan referensi internal untuk setiap simpul yang dipilih yang dapat digunakan untuk kueri tambahan. Kombinasi nodes() metode dan value() dapat lebih efisien dalam menghasilkan kumpulan baris ketika memiliki beberapa kolom dan, mungkin, ketika ekspresi jalur yang digunakan dalam pembuatannya rumit.

Metode ini nodes() menghasilkan instans jenis data xml khusus, yang masing-masing memiliki konteks yang diatur ke simpul yang dipilih yang berbeda. Instans query()XML semacam ini mendukung metode , value(), nodes(), dan exist() dan dapat digunakan dalam count(*) agregasi. Semua penggunaan lainnya menyebabkan kesalahan.

Contoh: Gunakan node()

Asumsikan bahwa Anda ingin mengekstrak nama depan dan belakang penulis, dan nama depannya bukan "David". Selain itu, Anda ingin mengekstrak informasi ini sebagai kumpulan baris yang berisi dua kolom, FirstName dan LastName. Dengan menggunakan nodes() metode dan value() , Anda dapat menyelesaikan ini seperti yang ditunjukkan dalam hal berikut:

SELECT nref.value('(first-name/text())[1]', 'nvarchar(50)') FirstName,
       nref.value('(last-name/text())[1]', 'nvarchar(50)') LastName
FROM   T CROSS APPLY xCol.nodes('//author') AS R(nref)
WHERE  nref.exist('first-name[. != "David"]') = 1;

Dalam contoh ini, nodes('//author') menghasilkan kumpulan baris referensi ke <author> elemen untuk setiap instans XML. Nama depan dan belakang penulis diperoleh dengan mengevaluasi value() metode relatif terhadap referensi tersebut.

SQL Server 2000 menyediakan kemampuan untuk menghasilkan kumpulan baris dari instans XML dengan menggunakan OpenXml(). Anda dapat menentukan skema relasional untuk kumpulan baris dan bagaimana nilai di dalam peta instans XML ke kolom di set baris.

Contoh: Gunakan OPENXML() pada jenis data xml

Kueri dapat ditulis ulang dari contoh sebelumnya dengan menggunakan OpenXml() seperti yang diperlihatkan dalam hal berikut ini. Ini dilakukan dengan membuat kursor yang membaca setiap instans XML ke dalam variabel XML lalu menerapkan OpenXML ke dalamnya:

DECLARE name_cursor CURSOR
FOR
   SELECT xCol
   FROM   T
OPEN name_cursor
DECLARE @xmlVal XML
DECLARE @idoc int
FETCH NEXT FROM name_cursor INTO @xmlVal;

WHILE (@@FETCH_STATUS = 0)
BEGIN
   EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlVal
   SELECT   *
   FROM   OPENXML (@idoc, '//author')
          WITH (FirstName  varchar(50) 'first-name',
                LastName   varchar(50) 'last-name') R
   WHERE  R.FirstName != 'David'

   EXEC sp_xml_removedocument @idoc
   FETCH NEXT FROM name_cursor INTO @xmlVal
END;
CLOSE name_cursor;
DEALLOCATE name_cursor;

OpenXml() membuat representasi dalam memori dan menggunakan tabel kerja alih-alih prosesor kueri. Ini bergantung pada prosesor XPath versi 1.0 dari MSXML versi 3.0 alih-alih mesin XQuery. Tabel kerja tidak dibagikan di antara beberapa panggilan ke OpenXml(), bahkan pada instans XML yang sama. Ini membatasi skalabilitasnya. OpenXml() memungkinkan Anda mengakses format tabel tepi untuk data XML saat klausa WITH tidak ditentukan. Selain itu, ini memungkinkan Anda untuk menggunakan nilai XML yang tersisa dalam kolom "luapan" terpisah.

Kombinasi nodes() fungsi dan value() menggunakan indeks XML secara efektif. Akibatnya, kombinasi ini dapat menunjukkan lebih banyak skalabilitas daripada OpenXml.

Lihat juga