sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:inline villkorlig konvertera med XML?

Det låter som att du behöver en version av ISNUMERIC funktion för XML-data.

Tyvärr finns ingen sådan inbyggd funktion - så du måste ta fram ditt eget alternativ, för vilket det finns ett par alternativ:

Om detta är en engångs- eller småskalig process för vilken prestanda inte är avgörande, kan du bearbeta inmatningstabellerna en rad i taget inuti en markör, med hjälp av en TRY...CATCH block för att hantera ogiltiga kast (otestad):

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, om du är bekväm med .Net-programmering (och den är aktiverad på din server) kan du använda CLR för att skapa din egen IsXML-funktion. .Net-koden behöver inte vara mycket mer komplex än det tredje inlägget i den här tråden a> .

Prestandan för CLR-lösningen kanske inte är så mycket bättre än markören - du måste testa för att fastställa detta.

(En självklar sak att prova, som inte fungerar, är en skalärt värderad T-SQL-funktion som försöker casta fältet till XML i en TRY...CATCH blockera. Men TRY...CATCH är inte tillåtet i en funktion.)




  1. Byt namn på Oracle 11g. Garanterat atomär?

  2. Välj spelare med fast troféantal och poäng

  3. Textfilstruktur (tabeller)

  4. Hur man implementerar databasoberoende med Entity Framework