2016-03-16 7 views
0

У меня есть разные столбцы «сообщения», которые являются varchar, которые должны быть xml, но некоторые из них могут быть неверными или действительными. Я пытаюсь вырезать строки, которые имеют заданное входное значение для узла следующим образом: Выберите * из messagelog, где сообщение типа '% 1234567%'Как выбрать узел из потенциально не правильно сформированного xml как varchar?

Но когда я отфильтровываю те, чтобы попытаться поднять другой узел (1234567)) Какая ценность я не знаю, я сталкиваюсь с этой проблемой.

Я запустил каждую запись в xml wont work, так как 1% сообщений недействительны.

Этот код не анализирует varchar в xml, но возвращает подстроку, если она существует. Тем не менее, я получаю ошибку преобразования в случае charindex = 0. Некоторые MessageIds - это большие varchars.

Есть ли что-нибудь, что мне здесь не хватает? Я SOL для использования SQL для синтаксического анализа неформатированных XML-varchars?

select 
case when CAST(charindex('<RelatesToMessageID>', message) as varchar(100)) = 0 
then 1 
else 
substring(message, charindex('<RelatesToMessageID>', message)+20,  charindex('</RelatesToMessageID>', message)-charindex('<RelatesToMessageID>', message)-20) 
end 
from messagelog 

Conversion failed when converting the varchar value '959B91D824324108948261EC2A81CD92' to data type int. 

ответ

1

Ваш CASE возвращается как в VARCHAR и INT. Вы должны изменить then 1 к then '1' так что обе части вашей CASE возвращает VARCHAR

1

Я видел, что я мог выбрать подстроку только в тех местах, где есть существующий NCPDPID. Это полностью избавит вас от дела.

if exists(Select * from messagelog where message like '%<NCPDPID>1234567</NCPDPID>%') 

select substring(message, charindex('<MessageID>', message)+11, charindex('</MessageID>', message)-charindex('<MessageID>', message)-11) from messagelog where message like '%<NCPDPID>1234567</NCPDPID>%'