Hanya melihat bidang XML saya, baris saya terlihat seperti ini:
<person><firstName>Jon</firstName><lastName>Johnson</lastName></person>
<person><firstName>Kathy</firstName><lastName>Carter</lastName></person>
<person><firstName>Bob</firstName><lastName>Burns</lastName></person>
Perhatikan bahwa ini adalah tiga baris di tabel saya.
Saya ingin mengembalikan hasil SQL sebagai tabel seperti di
Jon | Johnson
Kathy| Carter
Bob | Burns
Pertanyaan apa yang akan menyelesaikannya?
sql-server
xml
xpath
Larsenal
sumber
sumber
Jawaban:
Mengingat bidang XML bernama 'xmlField' ...
sumber
The XQuery syntax '/function()' is not supported.
; Di sisi lain @Remus Rusanu tampaknya melakukannya :)<BAM><Type>Electrical</Type><BaIds><a:int>7330</a:int></BaIds></BAM>
saya, pilih sayaselect e.MessageData.value('(/BAM/Type)[1]', 'varchar(100)')
. Saya juga mencoba pilihe.MessageData.value('(/BAM/Type/node())[1]', 'varchar(100)')
, dan'(//Type/node())[1]'
,'(./Type)[1]'
, dan setiap kombinasi lain saya bisa memikirkan. Yang saya dapatkan hanyalahNULL
.Mempertimbangkan bahwa data XML berasal dari tabel 'tabel' dan disimpan di kolom 'bidang': gunakan metode XML , ekstrak nilai dengan
xml.value()
, simpul proyek denganxml.nodes()
, gunakanCROSS APPLY
untuk bergabung:Anda dapat membuang
nodes()
dancross apply
jika setiap bidang berisi tepat satu elemen 'orang'. Jika XML adalah variabel yang Anda pilihFROM @variable.nodes(...)
dan Anda tidak memerlukancross apply
.sumber
Posting ini sangat membantu untuk menyelesaikan masalah saya yang memiliki format XML yang sedikit berbeda ... XML saya berisi daftar kunci seperti contoh berikut dan saya menyimpan XML di kolom SourceKeys dalam tabel bernama DeleteBatch:
Buat tabel dan isi dengan beberapa data:
Inilah SQL saya untuk memilih kunci dari XML:
Berikut hasil query ...
sumber
Ini mungkin menjawab pertanyaan Anda:
sumber
Astaga. Ini adalah utas yang sangat berguna untuk ditemukan.
Saya masih menemukan beberapa dari saran ini membingungkan. Setiap kali saya menggunakan
value
dengan[1]
dalam string, itu hanya akan mengambil nilai pertama. Dan beberapa saran merekomendasikan penggunaancross apply
yang (dalam pengujian saya) hanya menghasilkan terlalu banyak data.Jadi, inilah contoh sederhana saya tentang cara membuat
xml
objek, lalu membacakan nilainya ke dalam tabel.Dan inilah hasilnya:
Ini sintaks yang aneh, tetapi dengan contoh yang layak, cukup mudah untuk menambahkan fungsi SQL Server Anda sendiri.
Ngomong-ngomong, inilah jawaban yang benar untuk pertanyaan ini.
Dengan asumsi Anda memiliki data xml Anda dalam
@xml
variabel tipexml
(seperti yang ditunjukkan dalam contoh saya di atas), berikut ini cara Anda mengembalikan tiga baris data dari xml yang dikutip dalam pertanyaan:sumber
[1]
, indeks ordinal untuk memaksanya mengembalikan 1 baris, atau Anda harus menerapkan silang kolom dengannodes()
untuk mendapatkan a struktur yang dapat dijalankan oleh xpath terhadapnya. Kode Anda tidak diterjemahkan ke skenario itu tanpa banyak modifikasi. Anda menggunakan variabel, bukan kolom tabel. Anda juga terlalu banyak menggunakanquery()
fungsi yang mengembalikan xml. misalnya Anda bisa sajax.Rec.value('(./firstName)[1]', 'nvarchar(2000)') AS FirstName
Jika Anda dapat membungkus XML Anda dalam elemen root - katakan berikut ini adalah solusi Anda:
sumber
MSSQL menggunakan aturan XPath biasa sebagai berikut:
W3Schools
sumber
sumber
/ * Contoh ini menggunakan variabel XML dengan skema * /
sumber