2

次の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>

私が必要としているのは、ルート要素のみでxmlns宣言を含むxmlを返すことです。例えば:

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

これを行う方法はありますか?

注:上記のSQLは実際のコードを極端に単純化したものであり、複雑なドキュメントが生成されるため、FOR XML PATHから変更することは、2、3日の余分な作業を行わずに行うオプションではありません。ドキュメント全体のトップレベルで明確にするためには、NSが必要であり、すべての子はNSを持っていない必要があります。

4

2 に答える 2

2

「地獄からのクエリ」を使用できます

;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
于 2011-10-13T13:02:53.333 に答える
1

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')
于 2014-08-12T15:53:13.493 に答える