2013-07-30 15 views
8

Ho alcuni valori xml validi e non validi memorizzati in una colonna varchar.t-sql: converte varchar in xml

Vorrei trasmettere i valori xml validi al tipo di dati xml effettivo e non validi a null.

Qual è un buon modo per farlo?

Qualcosa di simile:

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

Quale versione di SQL Server? –

+0

Microsoft SQL Server 2008 (SP1) – David

+1

Non è possibile ** eseguire un processo durante il caricamento ** di questi dati per rifiutare XML non valido, altrimenti si esegue questa query tramite una funzione ogni volta che si utilizza questa istruzione select, che non è ideale per le prestazioni. – christiandev

risposta

0

Se è necessario mantenere il XML sia valido o non valido, si potrebbe avere un bandiera sul tavolo come IsValid (bit). Il processo di caricamento potrebbe quindi eseguire un controllo unico su questi dati per verificare se l'XML è valido e impostare il flag in base al risultato. In questo modo è possibile ottenere il codice XML valido utilizzando la query:

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

Se non è necessario per mantenere XML non valido, poi basta rifiutano durante il caricamento, impostando il campo a NULL, quindi la query apparirebbe come:

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

Entrambi i modi darà la migliore prestazione che passando attraverso un SQL function per ogni query.

+1

Sì, ma il problema della mia domanda è: come posso verificare se XML è valido in primo luogo? – David

+0

'Ho alcuni valori xml validi e non validi memorizzati in una colonna varchar. - Questo passaggio di archiviazione è sotto il tuo controllo? o stai interrogando su una tabella precompilata? – christiandev

+0

una tabella prepopolata. Fondamentalmente, ho bisogno di un modo per verificare la validità della stringa XML usando t-sql. – David

4

In risposta esclusivamente a questo:

Sì, ma la carne della mia domanda è: come faccio a controllare è XML è valido primo luogo?

È il vostro XML non valido, nel senso che si otterrà una pausa come la seconda linea di sotto di questo:

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

Una soluzione che vedo è un approccio riga per riga, in cui si tenta e CAST una riga come XML e, se viene eseguito come XML, inserire correttamente la riga valida in una tabella con valori validi XML, se non viene eseguita correttamente, il valore non viene inserito. See this thread for examples.

+1

Grazie per il collegamento all'altro thread, in cui suggeriva di analizzare manualmente il token in questione. Questo è quello che ho finito per fare. – Alan

1

tenta di utilizzare 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 

uscita -

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

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