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

Откуда:
Сообщений: 202
Пример:
if OBJECT_ID('tempdb..#t') is not null 
	drop table #t;

Create table #t
	(i int identity (1,1) not null
	,f1 nvarchar(255) Null
	,f2 nvarchar(255) Null
	,ii int Null
	Constraint PK_i primary key clustered (i))

Insert into #t (f1, f2, ii)
Values ('nom 1.', 'prim 1.', Null)
, ('nom 1.', 'prim 2.', Null)
, ('nom 1.', Null, Null)
, ('nom 2.', Null, 1)
, ('nom 2.a', Null, 1)
, ('nom 2.b', Null, 1)
, ('nom 2.b', 'prim 3.', 1)
, ('nom 2.', Null, 2)


Select *
	,(select * from #t b
		where a.i = b.ii
	For xml path('prim'), ELEMENTS XSINIL, type
	) 
	from #t a
For xml path('nom'), root('book'), ELEMENTS XSINIL, type
Пример генерирует вот такой хмл:

[SRC XML]
<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <nom>
    <i>1</i>
    <f1>nom 1.</f1>
    <f2>prim 1.</f2>
    <ii xsi:nil="true" />
    <prim xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <i>4</i>
      <f1>nom 2.</f1>
      <f2 xsi:nil="true" />
      <ii>1</ii>
    </prim>
    <prim xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <i>5</i>
      <f1>nom 2.a</f1>
      <f2 xsi:nil="true" />
      <ii>1</ii>
    </prim>
    <prim xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <i>6</i>
      <f1>nom 2.b</f1>
      <f2 xsi:nil="true" />
      <ii>1</ii>
    </prim>
    <prim xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <i>7</i>
      <f1>nom 2.b</f1>
      <f2>prim 3.</f2>
      <ii>1</ii>
    </prim>
  </nom>
  <nom>
    <i>2</i>
    <f1>nom 1.</f1>
    <f2>prim 2.</f2>
    <ii xsi:nil="true" />
    <prim xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <i>8</i>
      <f1>nom 2.</f1>
      <f2 xsi:nil="true" />
      <ii>2</ii>
    </prim>
  </nom>
  <nom>
    <i>3</i>
    <f1>nom 1.</f1>
    <f2 xsi:nil="true" />
    <ii xsi:nil="true" />
  </nom>
  <nom>
    <i>4</i>
    <f1>nom 2.</f1>
    <f2 xsi:nil="true" />
    <ii>1</ii>
  </nom>
  <nom>
    <i>5</i>
    <f1>nom 2.a</f1>
    <f2 xsi:nil="true" />
    <ii>1</ii>
  </nom>
  <nom>
    <i>6</i>
    <f1>nom 2.b</f1>
    <f2 xsi:nil="true" />
    <ii>1</ii>
  </nom>
  <nom>
    <i>7</i>
    <f1>nom 2.b</f1>
    <f2>prim 3.</f2>
    <ii>1</ii>
  </nom>
  <nom>
    <i>8</i>
    <f1>nom 2.</f1>
    <f2 xsi:nil="true" />
    <ii>2</ii>
  </nom>
</book>

Можно ли подавить повторные декларации xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" на уровне дочерних нод?
19 сен 17, 14:21    [20806122]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли предотвратить повторную декларацию namespace при выводе xml?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iii2, так?

Select *
	,(select * from #t b
		where a.i = b.ii
	For xml path('prim'), type
	) 
	from #t a
For xml path('nom'), root('book'), ELEMENTS XSINIL, type
19 сен 17, 14:31    [20806160]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли предотвратить повторную декларацию namespace при выводе xml?  [new]
aleks222
Guest
Вот так

Select *
, cast( (select * from #t b where a.i = b.ii For xml path('prim')) as xml )
from #t a
For xml path('nom'), root('book'), ELEMENTS XSINIL, type
19 сен 17, 15:24    [20806383]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли предотвратить повторную декларацию namespace при выводе xml?  [new]
iii2
Member

Откуда:
Сообщений: 202
Minamoto, aleks222, какие хитрые!
В этом случае не выводятся null значения в ветке prim.

И потом, я немного не это имел ввиду. Я думал, может существует способ сообщить sql server-у, что этот хмл нужно весь генерировать в контексте этого пространства имен, задекларировать его (как то) в заголовке, и дальше уже получать нечто такое: <f2 xsi:nil="true" /> на любом уровне вложенности.
19 сен 17, 16:03    [20806495]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли предотвратить повторную декларацию namespace при выводе xml?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iii2,

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/2f7bdfbf-8e40-456b-84e8-195318649703/how-to-remove-namespaces-from-xml-tags-when-using-for-xml-option-with-xmlnamespaces?forum=transactsql
Duplicate namespaces when creating nested XML is a known problem with FOR XML. There is an existing connect (Microsoft bug) for it, which you can vote for here:

http://connect.microsoft.com/SQLServer/feedback/details/265956/suppress-namespace-attributes-in-nested-select-for-xml-statements
19 сен 17, 16:22    [20806561]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли предотвратить повторную декларацию namespace при выводе xml?  [new]
iii2
Member

Откуда:
Сообщений: 202
Minamoto, спасибо, понятно.
Лучший вариант - забить.
Если совсем припрёт - то банальным реплейсом прибить лишнее...
Чудесно.
19 сен 17, 17:46    [20806898]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли предотвратить повторную декларацию namespace при выводе xml?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iii2, ну, в целом, да, учитывая тот факт, что на валидность XML это не влияет.
19 сен 17, 18:41    [20807015]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить