Пространство имен по умолчанию с FOR XML PATH - PullRequest
2 голосов
/ 13 октября 2011

Рассмотрим следующий SQL:

;WITH XMLNAMESPACES(DEFAULT 'http://www.mynamespace.co.uk')
,CTE_DummyData AS (
    select id=1
)
select TOP 1
    [@ID]=1,
    (select top 1 [@ID] = 1 FROM CTE_DummyData FOR XML PATH ('Child'), TYPE)
from CTE_DummyData
FOR XML PATH ('Parent')

Thie возвращает xml:

<Parent xmlns="http://www.mynamespace.co.uk" ID="1">
  <Child xmlns="http://www.mynamespace.co.uk" ID="1" />
</Parent>

Мне нужно вернуть xml с объявлением xmlns только на корневой элемент. например:

<Parent xmlns="http://www.mynamespace.co.uk" ID="1">
  <Child ID="1" />
</Parent>

Есть ли способ сделать это?

Примечание: Вышеприведенный SQL является крайним упрощением реального кода, который создает сложный документ, поэтому переход от FOR XML PATH на самом деле не вариант, если мне не придется потратить пару дней дополнительной работы. Для ясности на верхнем уровне всего документа требуется наличие NS, а все дети должны быть без него.

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Вы можете использовать "запрос из ада"

;with CTE_DummyData AS (
    select id=1
)
select 1 as tag,
       0 as parent,
       'http://www.mynamespace.co.uk' as [Parent!1!xmlns],
       id as [Parent!1!ID],
       null as [Child!2!ID]
from CTE_DummyData       
union all
select top 1
       2,
       1,
       null,
       null,
       id
from CTE_DummyData       
for xml explicit
1 голос
/ 12 августа 2014

Вы можете использовать UDF для генерации дочерних узлов. Э.Г.

ALTER FUNCTION [dbo].[udf_get_child_section] (
    @serviceHeaderId INT
 )
RETURNS XML

BEGIN

    DECLARE @result XML;

    SELECT @result = 
    (
        SELECT 1 AS 'ChildElement'
        FOR XML PATH('Child')
    )

    RETURN @result

END


GO

DECLARE @Ids TABLE
( 
    ID int 
)

INSERT INTO @Ids
SELECT 1 AS ID 
UNION ALL
SELECT 2 AS ID

;WITH XMLNAMESPACES (DEFAULT 'http://www...com/content')
SELECT 
    [dbo].[udf_get_child_section](ID)
FROM 
    @Ids
FOR XML PATH('Parent')
...