Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как избавиться от лишнего неймспейса в селекте  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1556
День добрый!
MSSQL 2012.
Есть задача - разобрать xml и сгенерить на его основе таблицу, один из столбцов которой будет xml. Исходный xml содержит неймспейсы, поэтому приходится их указывать в WITH XMLNAMESPACES для сокращения кода, но тогда на выходе они попадают в xml поля:

declare	@x xml = '<data xmlns="abc">
<a>1</a>
<a>2</a>
<a>3</a>
</data>
'

;with xmlnamespaces( 'abc' as a)
select	b.value( 'text()[1]', 'int')
	,	(select 'test' as test for xml path)
from	@x.nodes('/a:data/a:a') a(b)

На выходе
VX
1<row xmlns:a="abc"><test>test</test></row>
2<row xmlns:a="abc"><test>test</test></row>
3<row xmlns:a="abc"><test>test</test></row>


Никак не могу найти способ, как убрать xmlns:a="abc" из поля. Да, я могу это сделать через временную таблицу или указывать неймспейсы по всех XML методах, но может есть метод попроще?


С уважением, Князев Константин
7 сен 15, 12:00    [18117756]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от лишнего неймспейса в селекте  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
select	b.value( 'text()[1]', 'int')
	,	(select 'test' as test for xml path)
from	@x.nodes('/*:data/*:a') a(b)
7 сен 15, 12:12    [18117842]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от лишнего неймспейса в селекте  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1556
invm,

Спасибо, не подумал про такой вариант. Хоть и теряется привязка к неймспейсу, но это не критично, в данном случае.
9 сен 15, 09:38    [18126417]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от лишнего неймспейса в селекте  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Zelius
Хоть и теряется привязка к неймспейсу
Еще можно так:
select	b.value( 'text()[1]', 'int')
	,	(select 'test' as test for xml path)
from	@x.nodes('declare namespace a="abc"; /a:data/a:a') a(b);
9 сен 15, 12:39    [18127625]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить