Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server:konversi bersyarat sebaris dengan XML?

Sepertinya Anda memerlukan versi ISNUMERIC fungsi untuk data XML.

Sayangnya tidak ada fungsi bawaan seperti itu - jadi Anda harus memikirkan alternatif Anda sendiri, yang ada beberapa opsi:

Jika ini adalah proses satu kali atau skala kecil yang kinerjanya tidak terlalu penting, Anda dapat memproses tabel input satu baris pada satu waktu di dalam kursor, menggunakan TRY...CATCH blok untuk menangani pemeran yang tidak valid (belum diuji):

DECLARE xmlCur CURSOR FOR
SELECT textcol 
FROM inputTable

OPEN xmlCur
DECLARE @string nvarchar(MAX)
DECLARE @xml xml

FETCH NEXT FROM xmlCur into @string

WHILE @@fetch_status = 0
BEGIN
    BEGIN TRY
        SET @xml = CAST(@string AS XML)
        -- Do something with XML
    END TRY
    BEGIN CATCH
        -- log failure/mark source row as invalid
    END CATCH

    FETCH NEXT FROM xmlCur into @string
END

CLOSE xmlCur
DEALLOCATE xmlCur 

Atau, jika Anda merasa nyaman dengan pemrograman .Net (dan itu diaktifkan di server Anda), Anda dapat menggunakan CLR untuk membuat fungsi IsXML Anda sendiri. Kode .Net harus tidak lebih kompleks daripada postingan ketiga di utas ini .

Kinerja solusi CLR mungkin tidak jauh lebih baik daripada kursor - Anda perlu menguji untuk menetapkan ini.

(Hal yang jelas untuk dicoba, yang tidak berhasil, adalah fungsi T-SQL bernilai skalar yang mencoba mentransmisikan bidang ke XML di dalam TRY...CATCH memblokir. Namun, TRY...CATCH tidak diizinkan di dalam suatu fungsi.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengambil baris terakhir kedua dengan hanya satu pilihan di SQL Server?

  2. SQL Query dengan NOT LIKE IN

  3. Pivot Beberapa Kolom di T-SQL

  4. Bagaimana cara membuat tampilan dengan 14000 Kolom di dalamnya?

  5. Periksa apakah Objek adalah Tabel, Tampilan, atau Prosedur Tersimpan di SQL Server menggunakan Fungsi OBJECTPROPERTY()