2015-10-21 3 views
3

Я новичок в XML вещи, и у меня есть этот XML данные ..XML SQL Server запрашивая неправильный выход

<?xml version="1.0"?> 
<OMeS xmlns="pm/cnf_pte_msn.1.0.xsd"> 
    <PMSetup startTime="2015-10-21T00:00:00.000+00:00:00" interval="60"> 

    <PMMOResult> 
     <MO> 
     <baseId>12345</baseId> 
     <localMoid>67890</localMoid> 
     </MO> 
     <NE_1.0 measurementType="S1"> 
     <M8000C0>1601</M8000C0> 
     <M8000C1>1597</M8000C1> 
     <M8000C2>4</M8000C2> 
     <M8000C3>0</M8000C3> 
     <M8000C4>0</M8000C4> 
     <M8000C5>0</M8000C5> 
     </NE_1.0> 
    </PMMOResult> 

    <PMMOResult> 
     <MO> 
     <baseId>678910</baseId> 
     <localMoid>109876</localMoid> 
     </MO> 
     <NE_1.0 measurementType="S1"> 
     <M8000C0>860</M8000C0> 
     <M8000C1>858</M8000C1> 
     <M8000C2>2</M8000C2> 
     <M8000C3>0</M8000C3> 
     <M8000C4>0</M8000C4> 
     <M8000C5>0</M8000C5> 
     </NE_1.0> 
    </PMMOResult> 

    <PMMOResult> 
     <MO> 
     <baseId>111213</baseId> 
     <localMoid>131211</localMoid> 
     </MO> 
     <NE_1.0 measurementType="S1"> 
     <M8000C0>3533</M8000C0> 
     <M8000C1>3504</M8000C1> 
     <M8000C2>29</M8000C2> 
     <M8000C3>0</M8000C3> 
     <M8000C4>0</M8000C4> 
     <M8000C5>0</M8000C5> 
     </NE_1.0> 
    </PMMOResult> 

    </PMSetup> 
</OMeS> 

Теперь я хочу запросить его затем вставить в структуру таблицы, как это ..

startTime | interval | baseId | localMoid | M8000C0 | M8000C1 | M8000C2 | M8000C3 | M8000C4 | M8000C5 

Но я получаю неправильный вывод. Pls. Помогите! Вот мой пример запроса только код:

;WITH XMLNAMESPACES (DEFAULT 'pm/cnf_pte_msn.1.0.xsd') 
SELECT 
Tier1.value('@startTime', 'varchar(50)') as startTime, 
Tier1.value('@interval', 'int') as interval, 
Tier2.value('baseId[1]', 'varchar(50)') as baseId, 
Tier2.value('localMoid[1]', 'varchar(50)') as localMoid, 
Tier3.value('M8000C0[1]', 'float') as M8000C0, 
Tier3.value('M8000C1[1]', 'float') as M8000C1, 
Tier3.value('M8000C2[1]', 'float') as M8000C2, 
Tier3.value('M8000C3[1]', 'float') as M8000C3, 
Tier3.value('M8000C4[1]', 'float') as M8000C4, 
Tier3.value('M8000C5[1]', 'float') as M8000C5 
FROM 
@RawXML.nodes('/OMeS/PMSetup') as T1(Tier1) 
cross apply @RawXML.nodes('/OMeS/PMSetup/PMMOResult/MO') as T2(Tier2) 
cross apply @RawXML.nodes('/OMeS/PMSetup/PMMOResult/NE_1.0') as T3(Tier3) 
+2

'Но я получаю неправильный output.' Так покажите правильный. – lad2025

ответ

1

Ваш вопрос не ясно, что правильный результат, но я предполагаю, что вы хотите одну строку для каждого XML-элемента <PMMOResult>:

;WITH XMLNAMESPACES (DEFAULT 'pm/cnf_pte_msn.1.0.xsd') 
SELECT 
Tier1.value('@startTime', 'varchar(50)') as startTime, 
Tier1.value('@interval', 'int') as interval, 
Tier2.value('((.)/MO/baseId)[1]', 'varchar(50)') as baseId, 
Tier2.value('((.)/MO/localMoid)[1]', 'varchar(50)') as localMoid, 
Tier2.value('((.)/NE_1.0/M8000C0)[1]', 'float') as M8000C0, 
Tier2.value('((.)/NE_1.0/M8000C1)[1]', 'float') as M8000C1, 
Tier2.value('((.)/NE_1.0/M8000C2)[1]', 'float') as M8000C2, 
Tier2.value('((.)/NE_1.0/M8000C3)[1]', 'float') as M8000C3, 
Tier2.value('((.)/NE_1.0/M8000C4)[1]', 'float') as M8000C4, 
Tier2.value('((.)/NE_1.0/M8000C5)[1]', 'float') as M8000C5 
FROM @RawXML.nodes('/OMeS/PMSetup') as T1(Tier1) 
cross apply @RawXML.nodes('/OMeS/PMSetup/PMMOResult') as T2(Tier2); 

LiveDemo

Выход:

╔══════════════════════════════════╦══════════╦════════╦═══════════╦═════════╦═════════╦═════════╦═════════╦═════════╦═════════╗ 
║   startTime    ║ interval ║ baseId ║ localMoid ║ M8000C0 ║ M8000C1 ║ M8000C2 ║ M8000C3 ║ M8000C4 ║ M8000C5 ║ 
╠══════════════════════════════════╬══════════╬════════╬═══════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╣ 
║ 2015-10-21T00:00:00.000+00:00:00 ║  60 ║ 12345 ║  67890 ║ 1601 ║ 1597 ║  4 ║  0 ║  0 ║ 0 ║ 
║ 2015-10-21T00:00:00.000+00:00:00 ║  60 ║ 678910 ║ 109876 ║  860 ║  858 ║  2 ║  0 ║  0 ║ 0 ║ 
║ 2015-10-21T00:00:00.000+00:00:00 ║  60 ║ 111213 ║ 131211 ║ 3533 ║ 3504 ║  29 ║  0 ║  0 ║ 0 ║ 
╚══════════════════════════════════╩══════════╩════════╩═══════════╩═════════╩═════════╩═════════╩═════════╩═════════╩═════════╝ 

EDIT:

Даже проще, нет необходимости CROSS APPLY:

;WITH XMLNAMESPACES (DEFAULT 'pm/cnf_pte_msn.1.0.xsd') 
SELECT 
Tier2.value('../@startTime', 'varchar(50)') as startTime, 
Tier2.value('../@interval', 'int') as interval, 
Tier2.value('((.)/MO/baseId)[1]', 'varchar(50)') as baseId, 
Tier2.value('((.)/MO/localMoid)[1]', 'varchar(50)') as localMoid, 
Tier2.value('((.)/NE_1.0/M8000C0)[1]', 'float') as M8000C0, 
Tier2.value('((.)/NE_1.0/M8000C1)[1]', 'float') as M8000C1, 
Tier2.value('((.)/NE_1.0/M8000C2)[1]', 'float') as M8000C2, 
Tier2.value('((.)/NE_1.0/M8000C3)[1]', 'float') as M8000C3, 
Tier2.value('((.)/NE_1.0/M8000C4)[1]', 'float') as M8000C4, 
Tier2.value('((.)/NE_1.0/M8000C4)[1]', 'float') as M8000C5 
FROM @RawXML.nodes('/OMeS/PMSetup/PMMOResult') as T2(Tier2); 

LiveDemo

+1

Спасибо большое, сэр! Это правильный ответ. – MrH

+0

@MrH Добро пожаловать. Я обновил еще более простое решение – lad2025

+1

Отлично! Благодарю. И гораздо чище. – MrH

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