2013-08-15 4 views
3

я следующий XML в таблице ALL_MRN колонка :запрос столбца XML в SQL SERVER

<Repetitions> 
<Repetition> 
    <Field>10228^^^L8 MRN^MRN</Field> 
    <Component_1>10228</Component_1> 
    <Component_2>L8 MRN</Component_2> 
    <Component_3>MRN</Component_3> 
</Repetition> 
<Repetition> 
    <Field>00283^^^CMRN^CMRN</Field> 
    <Component_1>00283</Component_1> 
    <Component_2>CMRN</Component_2> 
    <Component_3>CMRN</Component_3> 
</Repetition> 
<Repetition> 
    <Field>00294^^^L7 MRN^MRN</Field> 
    <Component_1>00283</Component_1> 
    <Component_2>L7 MRN</Component_2> 
    <Component_3>MRN</Component_3> 
</Repetition> 
</Repetitions> 

Я пытаюсь найти значение CMRN в Component_3 теге и если найден, то сцепить значения из Component_1 и Component_3 к сформировать строку.

Возможно ли использование курсоров или петель? Каков наилучший способ получить эту конкатенированную строку?

+0

Вы закрывающий тег '' для открытия тега ' 'и 4 для 2. –

ответ

2

Как об этом:

SELECT 
    C1_and_C3 = XRep.value('(Component_1)[1]', 'varchar(50)') + XRep.value('(Component_3)[1]', 'varchar(50)') 
FROM 
    dbo.ALL_MRN 
CROSS APPLY 
    PID3.nodes('/Repetitions/Repetition') AS XTbl(XRep) 
WHERE 
    XRep.value('(Component_3)[1]', 'varchar(50)') = 'CMRN' 

SQL Server 2005 и более поздние версии имеют довольно большую поддержку XQuery - там действительно нет необходимости курсоров!

КСТАТИ: ваш XML является недействительным - вы не можете иметь ведущую <Component_3> тег и закрыть, что с </Component_5> (то же самое относится и к <Component_2>....</Component_4>)

+0

Я исправил XML. Благодарю. – user2687103

+0

Это сработало. Огромное спасибо. – user2687103

1

Он работал. PID3 был varchar-типом, поэтому мне пришлось отдать в XML. Вот обновленная версия.

SELECT 
    C1_and_C3 = XRep.value('(Component_1)[1]', 'varchar(50)') + XRep.value('(Component_3)[1]', 'varchar(50)') 
FROM 
    dbo.ALL_MRN 
CROSS APPLY 
    (select cast(PID3 as XML)) as t1(x) 
CROSS APPLY 
    x.nodes('/Repetitions/Repetition') AS XTbl(XRep) 
WHERE 
    XRep.value('(Component_3)[1]', 'varchar(50)') = 'CMRN' 
2

Другой вариант, который использует язык XQuery и exist метод. Если метод EXIST возвращает 1 (True), это указывает на то, что Component_3 тег содержит значение CMRN

DECLARE @xml xml = 
'<Repetitions> 
<Repetition> 
    <Field>10228^^^L8 MRN^MRN</Field> 
    <Component_1>10228</Component_1> 
    <Component_2>L8 MRN</Component_2> 
    <Component_3>MRN</Component_3> 
</Repetition> 
<Repetition> 
<Field>00283^^^CMRN^CMRN</Field> 
<Component_1>00283</Component_1> 
<Component_2>CMRN</Component_2> 
<Component_3>CMRN</Component_3> 
</Repetition> 
<Repetition> 
<Field>00294^^^L7 MRN^MRN</Field> 
<Component_1>00283</Component_1> 
<Component_2>L7 MRN</Component_2> 
<Component_3>MRN</Component_3> 
</Repetition> 
</Repetitions>' 

DECLARE @Component_3 varchar(50) = 'CMRN' 
SELECT xmlCol.value('Component_1[1]', 'varchar(50)') + xmlCol.value('Component_3[1]', 'varchar(50)') 
FROM @xml.nodes('//Repetitions/Repetition') xmlTab(xmlCol) 
WHERE xmlCol.exist('Component_3[text() = sql:variable("@Component_3")]') = 1 

Посмотреть демо на SQLFiddle

Смежные вопросы