2012-04-06 4 views
1

У меня есть следующий код SQL:Получить поле из XML с помощью SQL Server 2005

declare @x xml 
set @x = 

'<ResultBlock> 
    <MatchSummary matches="1"><TotalMatchScore>900</TotalMatchScore> 
     <Rules totalRuleCount="9"> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_SWTEL_DEMP_DEADD</RuleID> 
       <Score>100</Score> 
      </Rule> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_MS</RuleID> 
       <Score>100</Score> 
      </Rule> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_PAS_MS</RuleID> 
       <Score>100</Score> 
      </Rule> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_CTEL_MS</RuleID> 
       <Score>100</Score> 
      </Rule> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_REF</RuleID> 
       <Score>100</Score> 
      </Rule> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_PAS_REF</RuleID> 
       <Score>100</Score> 
      </Rule> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_CTEL_REF</RuleID> 
       <Score>100</Score> 
      </Rule> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_MS_PER</RuleID> 
       <Score>100</Score> 
      </Rule> 
      <Rule ruleCount="1" isGlobal="1"> 
       <RuleID>MA_REF_PER</RuleID> 
       <Score>100</Score></Rule> 
     </Rules> 
     <MatchSchemes schemeCount="1"> 
      <Scheme> 
       <SchemeID>7</SchemeID> 
       <Score>900</Score> 
      </Scheme> 
     </MatchSchemes> 
    </MatchSummary> 
    <ErrorWarnings> 
     <Errors errorCount="0" /> 
     <Warnings warningCount="0" /> 
    </ErrorWarnings> 
</ResultBlock>' 

select x.value(N'RuleID', N'varchar(50)') as RuleID 
from @x.nodes(N'//RuleID') t(x) 

Мне нужно retrive все RuleID «с. Но следующий запрос генерирует ошибку: XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'. Что может быть неправильным?

ответ

2

Вы близки - ваш XPath возвращает список всех узлов <RuleID> как фрагменты XML - теперь вы хотите, чтобы извлечь фактическое значение элемента, так что вы должны использовать этот SQL XQuery для достижения этой цели:

select 
    x.value('.', 'varchar(50)') as RuleID 
from 
    @x.nodes('//RuleID') t(x) 

. говорит: просто дайте мне содержимое элемента - это то, что вы ищете, правильно?

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