2013-07-30 10 views
8

Mam niektóre prawidłowe i nieprawidłowe wartości xml przechowywane w kolumnie varchar.t-sql: konwersja varchar do xml

Chciałbym rzutować prawidłowe wartości xml na rzeczywisty typ danych XML i nieważne na wartości zerowe.

Co to jest dobry sposób na zrobienie tego?

Coś jak:

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

Jaka wersja SQL Server? –

+0

Microsoft SQL Server 2008 (SP1) – David

+1

Nie możesz ** uruchomić procesu podczas ładowania ** tych danych, aby odrzucić niepoprawny kod XML, w przeciwnym razie uruchamiasz to zapytanie za pomocą funkcji za każdym razem, gdy używasz tej instrukcji select, która nie jest idealny do wydajności. – christiandev

Odpowiedz

0

Jeśli trzeba zachować XML czy ważne lub nieważne, można mieć flagę na stole jak IsValid (bit). Proces ładowania może następnie wykonać jednorazowe sprawdzenie tych danych, aby sprawdzić, czy kod XML jest prawidłowy i ustawić flagę na podstawie wyniku. W ten sposób można uzyskać prawidłowy XML za pomocą zapytania:

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

Jeśli nie trzeba zachować nieprawidłowy XML, a potem po prostu odrzucić go podczas załadunku, ustawienie pola do NULL, więc zapytanie wyglądałoby jak:

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

Oba sposoby daje lepszą wydajność, która przechodzi przez SQL function dla każdego zapytania.

+1

Tak, ale wołowina mojego pytania brzmi: jak sprawdzić, czy XML jest ważny na pierwszym miejscu? – David

+0

'Mam niektóre prawidłowe i nieprawidłowe wartości xml przechowywane w kolumnie varchar. - Czy ten etap przechowywania pod kontrolą? lub czy odpowiadasz na wstępnie wypełniony stół? – christiandev

+0

wstępnie przygotowany stół. Zasadniczo potrzebuję sposobu sprawdzania poprawności łańcucha XML przy użyciu t-sql. – David

4

W odpowiedzi wyłącznie do tego:

Tak, ale wołowina z moim pytaniem jest to, jak mogę sprawdzić to XML jest ważne w pierwsze miejsce?

Czy Twój XML nieważny w tym sensie, że dostaniesz przerwy jak w drugim wierszu poniżej tego:

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

Jedno rozwiązanie widzę jest podejście wiersz po wierszu, gdzie można spróbować i CAST wiersz jako XML, a jeśli zostanie rzucony jako XML, pomyślnie wstawiony prawidłowy wiersz do tabeli z prawidłowymi wartościami XML, jeśli nie zostanie poprawnie rzucony, wartość nie zostanie wstawiona. See this thread for examples.

+1

Dzięki za link do innego wątku, gdzie zaproponowano ręczne przeanalizowanie tego tokena. Właśnie to zrobiłem. – Alan

1

spróbuje użyć 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 

Wyjście -

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

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