sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server:inline betinget konverter med XML?

Det lyder som om du har brug for en version af ISNUMERIC funktion til XML-data.

Desværre findes der ikke en sådan indbygget funktion - så du bliver nødt til at udtænke dit eget alternativ, som der er et par muligheder for:

Hvis dette er en enkeltstående eller lille skalaproces, hvor ydeevnen ikke er kritisk, kan du behandle inputtabellerne en række ad gangen inde i en markør ved at bruge en TRY...CATCH blok for at håndtere ugyldige kast (utestet):

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 

Alternativt, hvis du er fortrolig med .Net-programmering (og det er aktiveret på din server), kan du bruge CLR at oprette din egen IsXML-funktion. .Net-koden behøver ikke være meget mere kompleks end det tredje indlæg på denne tråd .

Ydeevnen af ​​CLR-løsningen er måske ikke så meget bedre end markøren - du skal teste for at fastslå dette.

(En indlysende ting at prøve, som ikke virker, er en skalar-værdi T-SQL-funktion, som forsøger at caste feltet til XML inde i en TRY...CATCH blok. Men TRY...CATCH er ikke tilladt i en funktion.)




  1. Hvordan man bruger en variabel fra en cursor i select-sætningen af ​​en anden markør i pl/sql

  2. PostgreSQL:unik begrænsning eller unikt indeks

  3. Mysql-data til en formateret HTML-tabel

  4. Oracle + dbunit får AmbiguousTableNameException