2011-10-13 43 views
2

考慮下面的SQL默認命名空間:與FOR XML PATH

;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中改變並不是一個真正的選擇,沒有給我幾天的額外工作。要在整個文件的頂層明確要求有NS,並且所有的孩子都應該沒有。

+0

我找不到方法,但他們應該有相同的含義 - 爲什麼你不能使用第一種形式? –

+0

@Damien:這是數據遷移過程的一部分。雖然第一個文檔意味着相同(如您所說),但當我們將其傳遞到(第三方)導入Web服務時,它不起作用。我認爲問題在於它使用了子查詢。如果您使用單個查詢並使用'[Child/@ ID]'定義Child元素,那麼它可以正常工作,但這需要對代碼進行一些重新思考(我已繼承) –

回答

2

可以使用"query from hell"

;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 
+0

+1 aargh - 在我的真實情況下嘗試和實施會很糟糕!這個想法很好,但我有一種方法來解決我的問題。 –

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') 
+0

原來的事情是,雖然這是一個更復雜的文件的簡化,所以這個想法是隻有頂層元素顯示NS,並且所有的孩子(在所有級別)都沒有。如果解決方案可以轉向,那麼您的解決方案將非常出色,以便頂層元素由UDF生成,其他則不會。你認爲你可以這樣工作嗎? –