2012-04-07 115 views
1

我試圖將FOR XML查詢的結果作爲文本。 我在這裏發現了一些類似的問題: Using SQL Server "FOR XML": Convert Result Datatype to Text/varchar/string whatever? 但在我的情況下,我使用WITH XMLNAMESPACES語句,並且此解決方案不適用於我。 如何才能將以下查詢的結果作爲文本獲取?使用SQL Server「FOR XML」:將結果轉換爲文本

WITH XMLNAMESPACES ('urn:blablablabla' as bi) 
SELECT 'urn:blablabla.xsd' AS "@xsi:schemaLocation", 

     (SELECT 'aaaa' AS 'bi:idValue', 
       'bbbb' AS 'bi:idContext' 
     FOR XML PATH('bi:Part1'),TYPE), 

     (SELECT 'cccc' AS 'bi:idValue', 
       'dddd' AS 'bi:idContext' 
     FOR XML PATH('bi:Part2'),TYPE) 
FOR XML PATH('bi:Items'), ELEMENTS XSINIL 

感謝


結果應該是這樣的:

<bi:Items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bi="urn:blablablabla" xsi:schemaLocation="urn:blablabla.xsd"> 
<bi:Part1 xmlns:bi="urn:blablablabla"> 
<bi:idValue>aaaa</bi:idValue> 
<bi:idContext>bbbb</bi:idContext> 
</bi:Part1> 
<bi:Part2 xmlns:bi="urn:blablablabla"> 
<bi:idValue>cccc</bi:idValue> 
<bi:idContext>dddd</bi:idContext> 
</bi:Part2> 
</bi:Items 

我的目標是得到這樣的結果作爲文本而不是XML數據類型。 例如做這樣的事情:

DECLARE @ResultText NVARCHAR(MAX) 
SET @ResultText = ... Returned text from this query ... 

另外,也許你知道我怎麼能避免在每個節點的命名空間的重複?

謝謝

+1

你應該輸出什麼樣的樣子? – RBarryYoung 2012-04-07 23:59:25

回答

1

您需要使用select而不是set

DECLARE @ResultText NVARCHAR(MAX); 

WITH XMLNAMESPACES ('urn:blablablabla' as bi) 
SELECT @ResultText = 
    (
    SELECT 'urn:blablabla.xsd' AS "@xsi:schemaLocation", 

      (SELECT 'aaaa' AS 'bi:idValue', 
        'bbbb' AS 'bi:idContext' 
      FOR XML PATH('bi:Part1'),TYPE), 

      (SELECT 'cccc' AS 'bi:idValue', 
        'dddd' AS 'bi:idContext' 
      FOR XML PATH('bi:Part2'),TYPE) 
    FOR XML PATH('bi:Items'), ELEMENTS XSINIL 
); 

更新:

避免重蹈命名空間

的根據這兩個答案有一種方法與for xml explicit做到這一點。

FOR XML PATH and xsi:nil attributes
How do I remove redundant namespace in nested query when using FOR XML PATH

如果你想要的行爲來改變未來,你可以在此連接項目投票。
suppress namespace attributes in nested SELECT FOR XML statements

+0

非常感謝! – BGO 2012-04-08 16:06:44

+0

不客氣。如果這樣做有效,您應該考慮使用右側的刻度線來接受此答案。它會向社區表明這個問題已經得到解答。 – 2012-04-08 18:27:33

+0

是的,它可以工作,但也許有人知道如何避免在每個節點中重複命名空間... – BGO 2012-04-08 19:14:03