2013-07-30 26 views
8

Ich habe einige gültige und ungültige XML-Werte in einer varchar-Spalte gespeichert.t-sql: varchar nach xml konvertieren

Ich möchte die gültigen XML-Werte auf den tatsächlichen XML-Datentyp und ungültige Nullwerte zu werfen.

Was ist ein guter Weg, dies zu tun?

Etwas wie:

SELECT 
    CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML) 
    ELSE null 
END 
+0

Welche Version von SQL Server? –

+0

Microsoft SQL Server 2008 (SP1) – David

+1

Können Sie nicht ** einen Prozess beim Laden läuft ** diese Daten ungültig XML ablehnen, sonst werden Sie diese Abfrage über eine Funktion, jedes Mal laufen Sie diese select-Anweisung verwenden, die nicht ist ideal für die Leistung. – christiandev

Antwort

0

Wenn Sie die XML ob gültig oder ungültig zu halten brauchen, könnten Sie eine Flagge auf dem Tisch wie IsValid (bit) haben. Der Ladevorgang könnte dann eine einmalige Überprüfung dieser Daten durchführen, um zu prüfen, ob der XML-Code gültig ist, und das Flag basierend auf dem Ergebnis setzen. Auf diese Weise können Sie die gültige XML erhalten, indem Sie die Abfrage mit:

SELECT 
    CASE WHEN IsValid = 1 THEN CAST(xml_data as XML) 
    ELSE null 
END 

Wenn Sie nicht ungültige XML halten müssen, dann lehnen sie nur während des Ladens, um das Feld zu NULL Einstellung, so dass die Abfrage aussehen würde, wie:

SELECT 
    CASE WHEN xml_data IS NOT NULL THEN CAST(xml_data as XML) 
    ELSE null 
END 

Beide Wege wird eine bessere Leistung geben, die für jede Abfrage durch eine SQL function vorbei.

+1

Ja, aber das Rindfleisch meiner Frage ist, wie überprüfe ich, ist XML in erster Linie gültig? – David

+0

'Ich habe einige gültige und ungültige Werte xml in einer varchar column.' gespeichert - ist dieser Speicherschritt unter Ihrer Kontrolle? oder abfragen Sie gegen einen Pre-besiedelten Tisch? – christiandev

+0

ein vorbesetzter Tisch. Im Grunde brauche ich eine Möglichkeit, XML-String-Gültigkeit mit t-sql zu überprüfen. – David

4

Als Reaktion allein auf diese:

Ja, aber das Rindfleisch meiner Frage ist, wie ist überprüfe ich XML in der erste Ort gültig ist?

Ist Ihr XML ungültig in dem Sinne, dass Sie eine Pause wie die zweite Zeile darunter erhalten werden:

SELECT CAST('<xml>Yep this is xml</xml>' AS XML) 
SELECT CAST('<xml>Nope, not xml</x' AS XML) 

Eine Lösung sehe ich eine Zeile-für-Zeile-Ansatz, in dem Sie versuchen, und CAST eine Reihe als XML, und wenn es als XML wirft einfügen erfolgreich die gültige Zeile in eine Tabelle mit gültigen XML Werten, wenn sie nicht korrekt gegossen werden, wird der Wert nicht eingelegt. See this thread for examples.

+1

Danke für den Link zu dem anderen Thread, wo es vorgeschlagen, für das Token in Frage zu analysieren. Das habe ich getan. – Alan

1

Versuchen zu verwenden sp_xml_preparedocument -

SET NOCOUNT ON; 

DECLARE @XML NVARCHAR(MAX) 
SELECT @XML = '<t>test</' 

DECLARE @hDoc INT 

BEGIN TRY 

    EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML 
    SELECT '"' + @XML + '" is valid' 
    EXEC sys.sp_xml_removedocument @hDoc 

END TRY 
BEGIN CATCH 
    SELECT '"' + @XML + '" is invalid'  
END CATCH 

SELECT @XML = '<t>test</t>' 

BEGIN TRY 

    EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML 
    SELECT '"' + @XML + '" is valid' 
    EXEC sys.sp_xml_removedocument @hDoc 

END TRY 
BEGIN CATCH 
    SELECT '"' + @XML + '" is invalid'  
END CATCH 

Ausgang -

------------------------- 
"<t>test</" is invalid 

------------------------- 
"<t>test</t>" is valid