Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server:Bedingte Inline-Konvertierung mit XML?

Anscheinend benötigen Sie eine Version von ISNUMERIC Funktion für XML-Daten.

Leider gibt es keine solche eingebaute Funktion - also müssen Sie sich Ihre eigene Alternative ausdenken, für die es ein paar Optionen gibt:

Wenn dies ein einmaliger oder kleiner Prozess ist, für den die Leistung nicht kritisch ist, können Sie die Eingabetabellen Zeile für Zeile innerhalb eines Cursors verarbeiten, indem Sie ein TRY...CATCH verwenden Block zur Behandlung ungültiger Umwandlungen (ungetestet):

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 

Wenn Sie mit der .Net-Programmierung vertraut sind (und diese auf Ihrem Server aktiviert ist), können Sie alternativ die CLR um Ihre eigene IsXML-Funktion zu erstellen. Der .Net-Code müsste nicht viel komplexer sein als der dritte Beitrag in diesem Thread .

Die Leistung der CLR-Lösung ist möglicherweise nicht viel besser als die des Cursors - Sie müssten dies testen, um dies festzustellen.

(Ein offensichtlicher Versuch, der nicht funktioniert, ist eine skalare T-SQL-Funktion, die versucht, das Feld innerhalb eines TRY...CATCH in XML umzuwandeln Block. Jedoch TRY...CATCH ist innerhalb einer Funktion nicht erlaubt.)