Как выбрать атрибут верхнего уровня столбца xml в SQL Server 2005?

19

У меня есть столбец xml в SQL Server 2005, который эквивалентен:

<Test foo="bar">
  <Otherstuff baz="belch" />
</Test>

Я хочу иметь возможность получить значение атрибута foo Test (корневой элемент) как varchar. Моя цель была бы чем-то вроде:

select cast( '<Test foo="bar"><Otherstuff baz="belch" /></Test>' as xml).value('@foo','varchar(20)') as Foo

Когда я запускаю указанный выше запрос, я получаю следующую ошибку:

  

Msg 2390, уровень 16, состояние 1, строка 1   XQuery [значение ()]: атрибут верхнего уровня   узлы не поддерживаются

    
задан Alex Argo 20.04.2009 в 22:38
источник

2 ответа

40

Джон Сондерс почти прав: -)

declare @Data XML
set @Data = '<Test foo="bar"><Otherstuff baz="belch" /></Test>'

select @Data.value('(/Test/@foo)[1]','varchar(20)') as Foo

Это работает для меня (SQL Server 2005 и 2008)

Марк

    
ответ дан marc_s 20.04.2009 в 23:05
источник
  • , если вы не знаете, что такое корневой элемент .. ??? в этом случае мы знаем, что это «Тест», но у меня есть поле XML, которое имеет разные XML в зависимости от значения в другом поле. так что это может быть <book> или <something_else> ... есть ли имя корневого элемента по умолчанию, которое мы можем использовать .. ??? –  Ads 20.02.2013 в 11:12
  • @Для использования подстановочного знака, например. // Элемент [@foo] или если вы что-то знаете о структуре / * / Элементы / Элемент [@foo] –  StuartLC 05.04.2014 в 15:22
  • Оберните запрос в parens. Sheesh; Я бы никогда не догадался. XML-запрос в TSQL отлично работает, но синтаксис слишком сложный. –  dudeNumber4 20.01.2018 в 23:01
3

Если вы не знаете корневой элемент:

select @Data.value('(/*/@foo)[1]','varchar(20)') as Foo
    
ответ дан bojidar alexandrov 21.02.2013 в 16:40
источник