4

ルートノードにデフォルトの名前空間を使用してT-SQLを使用してXMLファイルを生成しようとしていますが、子ノードに名前空間が定義されていません。

DECLARE @xmlData XML
DECLARE @xmlInner XML

SELECT @xmlInner =
(
SELECT * FROM dbo.GH_DATA_BS_EVLTN_MNTH_ANL [r]
FOR XML PATH('r'), TYPE
)

;WITH XMLNAMESPACES (DEFAULT 'http://www.testnamespace.com')
SELECT @xmlData = 

(
SELECT '2012-10-25T14:13:00Z' as "@DataFeedDate",@xmlInner
FOR XML PATH('root')
)

SELECT @xmlData

上記のスクリプトは、次のXMLファイルを生成します

<root xmlns="http://www.testnamespace.com" DataFeedDate="2012-10-25T14:13:00Z">
  <r xmlns="">
    <RPRT_DT_CD>2012-10-25T14:15:00-05:00</RPRT_DT_CD>
    <RPRT_MO_CD>2013-01</RPRT_MO_CD>
    <RPRT_EV_CD>1</RPRT_EV_CD>
  </r>
</root>

問題は、タグに空白の名前空間xmlns = ""が含まれていることですが、意図した結果は、名前空間が定義されていない状態で取得することです。

4

2 に答える 2

0

それを回避する唯一の方法は、次のように変更することです。

;WITH XMLNAMESPACES (DEFAULT 'http://www.testnamespace.com')

;WITH XMLNAMESPACES ('http://www.testnamespace.com' as anySuffix)
于 2013-03-14T14:08:46.993 に答える
-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')

結果:

<Parent xmlns="http://www...com/content">
  <Child xmlns="">
    <ChildElement>1</ChildElement>
  </Child>
</Parent>
<Parent xmlns="http://www...com/content">
  <Child xmlns="">
    <ChildElement>1</ChildElement>
  </Child>
</Parent>
于 2014-08-12T15:55:51.877 に答える