Saya memasukkan beberapa data XML ke kolom XML di SQL server tetapi setelah data dimasukkan, telah diubah oleh sql server. Berikut adalah data yang saya masukkan
<xsl:value-of select="name/n/given" />
<xsl:text> </xsl:text>
<xsl:value-of select="name/n/family" />
Ketika saya membacanya kembali, sepertinya ini
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Perhatikan baris kedua. Ini adalah masalah karena itu mengubah bagaimana output transformasi XSLT akan. Contoh pertama akan membuat spasi antara diberikan dan nama keluarga, sedangkan yang kedua tidak akan membuat spasi, jadi itu akan seperti John Johnsen, sedangkan yang pertama akan seperti John Johnsen.
Apakah ada cara untuk menyelesaikan ini?
sql-server
xml
Tuan Zach
sumber
sumber
_
atau~
) dan kemudian menggantinya dengan spasi pada waktu presentasi.Jawaban:
Anda dapat menggunakan
xml:space = "preserve"
node yang ingin Anda simpan di ruang kosong. Menggunakan xml: space adalah "hanya isyarat niat" tetapi SQL server ramah kepada kami di sini.Untuk satu simpul
Hasil:
Seluruh dokumen:
Hasil:
Opsi lain untuk keseluruhan dokumen adalah menggunakan convert dengan style 1 .
sumber
Halaman ini dari dokumentasi SQL Server mengatakan
Sebagai contoh Anda, saya menganggap itu menganggap ruang putih tag tengah tidak signifikan dan karena itu bebas untuk memperbaiki representasi. Saya tidak berpikir ada perbaikan untuk ini; itu hanya bagaimana SQL Server mengimplementasikan tipe data XML.
Work-arounds akan mencakup penggunaan place-holder alih-alih white space seperti yang dikatakan @Aaron. Konsumen harus ingat untuk memasukkan dan menghapus token ini. Atau tentukan kolom tersebut sebagai nvarchar dan bukan XML. Ini pasti akan mempertahankan semua ruang putih dan pemformatan lainnya. Contoh cepat:
Kolom nvarchar mempertahankan format input, sedangkan kolom XML tidak.
Anda akan kehilangan kemampuan untuk menggunakan XPATH dalam kueri SQL. Jika XML hanya robek dalam aplikasi ini tidak penting. Selanjutnya string karakter dapat dikompresi menghemat ruang dalam DB, jika ini penting bagi Anda.
sumber
Anda dapat membungkus ruang Anda di dalam
CDATA
saat menyimpan data:Tampaknya SQL server kemudian menyimpan ruang secara internal, tetapi menghapus
CDATA
markup yang tidak perlu itu sendiri ketika mendapatkan hasilnya kembali menggunakanSELECT
. Untungnya, ruang disimpan ketika menggunakan kembali hasil sepertiSELECT
:Hasilnya adalah:
sumber