sql >> Databáze >  >> RDS >> Sqlserver

SQL Server:inline podmíněný převod s XML?

Zdá se, že potřebujete verzi ISNUMERIC funkce pro data XML.

Žádná taková vestavěná funkce bohužel neexistuje – takže si budete muset vymyslet vlastní alternativu, pro kterou existuje několik možností:

Pokud se jedná o jednorázový proces nebo proces v malém měřítku, pro který není výkon kritický, můžete vstupní tabulky zpracovat jeden řádek po druhém uvnitř kurzoru pomocí TRY...CATCH blok pro zpracování neplatných přetypování (netestováno):

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 

Případně, pokud jste spokojeni s programováním .Net (a je na vašem serveru povoleno), můžete použít CLR k vytvoření vlastní funkce IsXML. Kód .Net by nemusel být o moc složitější než třetí příspěvek v tomto vláknu .

Výkon řešení CLR nemusí být o tolik lepší než výkon kurzoru – to byste museli otestovat.

(Samozřejmá věc, kterou je třeba vyzkoušet, která nefunguje, je skalární funkce T-SQL, která se pokouší přetypovat pole do XML uvnitř TRY...CATCH blok. Nicméně TRY...CATCH není povoleno uvnitř funkce.)




  1. Oracle SQL Developer 21.4.2 a SQLcl 21.4.1 jsou nyní k dispozici

  2. Vyhněte se pojmenování uživatelských uložených procedur SP% nebo SP_%

  3. SQL vícenásobný SELECT dotaz s funkcí xmlagg - Data nejsou vytažena požadovaným způsobem

  4. Vytvořit databázovou tabulku ActiveRecord bez sloupce :id?