Вернуть вычисленное имя элемента из запроса XML FLWOR - PullRequest
4 голосов
/ 18 ноября 2011

У меня есть следующие данные XML в SQLServer 2008 R2

DECLARE @data XML
SET @data = '<root attr1="val1" attr2="val2" attr3="val3"/>'

Я хотел бы получить список имен атрибутов из корня и вывести его в виде списка элементов, например:

<root>
  <attr1>val1</attr1>
  <attr2>val2</attr2>
  <attr3>val3</attr3>
</root>

Я играл с запросами FLWOR, чтобы получить то, что я хочу.Пока у меня есть это:

SELECT @data.query('
for $attr in /*/@*
return <test>{fn:string($attr)}</test>
')

Это нормально и почти то, что мне нужно, но когда я пытаюсь это сделать ...

SELECT @data.query('
for $attr in /*/@*
return <{fn:local-name($attr)}>{fn:string($attr)}</{fn:local-name($attr)}>
')

это не радует.Кажется, ему не нравится ничего, кроме жестко закодированного имени элемента.

Как я могу вернуть элемент с вычисленным именем?

Ответы [ 2 ]

5 голосов
/ 18 ноября 2011

Согласно Microsoft ,

В настоящее время мы поддерживаем только константные выражения для выражения имени вычисляемого элемента и конструкторов атрибутов.Обходной путь - создание динамического sql для cancat в имени атрибута.

0 голосов
/ 18 ноября 2011

Попробуйте конструкторы вычисляемых элементов :

SELECT @data.query('
for $attr in /*/@*
return element {fn:local-name($attr)} {fn:string($attr)}
')
...