2013-11-28 2 views
1

Когда я запускаю свой запрос, пространство имен добавляется с корневым элементом, но со вторым элементом у меня есть xmlns = "" ... и я хотел бы удалить что ... и мне нужно добавить префикс пространства имен к некоторым элементам.Как удалить ненужное пустое пространство имен и добавить префикс пространства имен в tSQL

Я привел пример:

declare @xml_h as xml 
declare @xml_d as xml 

select @xml_h = (
    select NewID() as [UID] 
    for XML PATH('Head') 
    ) 

select @xml_d = (
    select NULL, 
    (
     select 'V00001' as [ID], 
      'Some name' as [Name] 
     for XML PATH('SubData'), TYPE 
    ) 
    for XML PATH('Data') 
    ) 

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t) 
select @xml_h, @xml_d for XML PATH(''), ROOT('ROOT') 

Результат существо:

<ROOT xmlns:t="uri_2" xmlns="uri_1"> 
    <Head xmlns=""> 
     <UID>B12B8836-2061-4934-AC06-67D34579D1A6</UID> 
    </Head> 
    <Data xmlns=""> 
     <SubData> 
      <ID>V00001</ID> 
      <Name>Some name</Name> 
     </SubData> 
    </Data> 
</ROOT> 

Но мне это нужно:

<ROOT xmlns:t="uri_2" xmlns="uri_1"> 
    <Head> 
     <t:UID>B12B8836-2061-4934-AC06-67D34579D1A6</t:UID> 
    </Head> 
    <Data> 
     <t:SubData> 
      <t:ID>V00001</t:ID> 
      <t:Name>Some name</t:Name> 
     </t:SubData> 
    </Data> 
</ROOT> 

Есть ли способ, чтобы удалить ненужные пустые пространства имен и добавить префикс пространства имен?

благодаря

+0

Может быть, вы можете просто добавить 't:' в имена столбцов в запросе типа '... выбрать NewID() как [t: UID]' и так далее? Как сервер sql знает, что префикс пространства имен? – Stoleg

ответ

0

Это будет строить XML, что эквивалентно тому, который вы хотите.

declare @xml_h as xml 
declare @xml_d as xml 

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t) 
select @xml_h = (
    select NewID() as [t.UID] 
    for XML PATH('Head') 
    ) 

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t) 
select @xml_d = (
    select NULL, 
    (
     select 'V00001' as [t.ID], 
      'Some name' as [t.Name] 
     for XML PATH('t.SubData'), TYPE 
    ) 
    for XML PATH('Data') 
    ) 

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t) 
select @xml_h, @xml_d for XML PATH(''), ROOT('ROOT') 
<ROOT xmlns:t="uri_2" xmlns="uri_1"> 
    <Head xmlns:t="uri_2" xmlns="uri_1"> 
    <t.UID>ABBECBF4-59BE-46DF-B42E-4325748E0079</t.UID> 
    </Head> 
    <Data xmlns:t="uri_2" xmlns="uri_1"> 
    <t.SubData xmlns:t="uri_2" xmlns="uri_1"> 
     <t.ID>V00001</t.ID> 
     <t.Name>Some name</t.Name> 
    </t.SubData> 
    </Data> 
</ROOT> 

Как вы можете видеть, что есть объявления пространства имен повторяются в суб-элементов. Если у вас действительно есть проблема с этим, вы можете либо переписать свой запрос на использование EXPLICIT Mode, либо добавить свой голос в this connect item и надеяться, что он станет частью будущей версии SQL Server.

+0

Спасибо за ответ. Наконец, мне пришлось переписать запрос для использования в режиме EXPLICIT. – urys

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