sql >> Database >  >> RDS >> Sqlserver

SQL Server:inline voorwaardelijke conversie met XML?

Het klinkt alsof je een versie van de ISNUMERIC functie voor XML-gegevens.

Helaas bestaat zo'n ingebouwde functie niet - dus je zult je eigen alternatief moeten bedenken, waarvoor er een aantal opties zijn:

Als dit een eenmalig of kleinschalig proces is waarvoor de prestaties niet van cruciaal belang zijn, kunt u de invoertabellen rij voor rij binnen een cursor verwerken, met behulp van een TRY...CATCH blok om ongeldige casts af te handelen (niet getest):

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 

Als alternatief, als u vertrouwd bent met .Net-programmering (en het is ingeschakeld op uw server), kunt u de CLR om uw eigen IsXML-functie te maken. De .Net-code zou niet veel complexer moeten zijn dan de derde post op deze thread .

De prestaties van de CLR-oplossing zijn misschien niet zo veel beter dan de cursor - je zou moeten testen om dit vast te stellen.

(Een voor de hand liggend ding om te proberen, wat niet werkt, is een scalaire waarde T-SQL-functie die probeert het veld naar XML te casten in een TRY...CATCH blok. Echter, TRY...CATCH is niet toegestaan ​​binnen een functie.)




  1. Hoe krijg ik BLOB van bestand in PL/SQL?

  2. Hoe verklein ik de grootte van mijn sql-serverlogbestand?

  3. voorwaardelijke unieke beperking

  4. TypeORM PostgreSQL selecteer waar het JSON-veld gelijk is aan een bepaalde waarde