繁体   English   中英

如何通过使用T-SQL的xml数据类型方法(查询)在生成的XML的根元素上设置xmlns属性?

[英]How do I set the xmlns attribute on the root element in the generated XML by using T-SQL's xml data type method: query?

我创建了我的问题的简化版本:

DECLARE @X XML = 
'<Root xmlns="TestNS" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Test>
        <Id>1</Id>
        <InnerCollection>
            <InnerItem>
                <Value>1</Value>
            </InnerItem>
            <InnerItem>
                <Value>2</Value>
            </InnerItem>
            <InnerItem>
                <Value>3</Value>
            </InnerItem>
        </InnerCollection>
    </Test>
    <Test>
        <Id>2</Id>
        <InnerCollection>
            <InnerItem>
                <Value>5</Value>
            </InnerItem>
            <InnerItem>
                <Value>6</Value>
            </InnerItem>
            <InnerItem>
                <Value>7</Value>
            </InnerItem>
        </InnerCollection>
    </Test>
</Root>'

我正在尝试编写一个查询,该查询接受每个<Test>元素并将其分成一行。 在每一行中,我想选择Id和InnerCollection作为XML。 我想为第一行(Id:1)创建此InnerCollection XML:

<InnerCollection xmlns="Reed.Api" xmlnsi="http//www.w3.org/2001/XMLSchema-instance">
  <InnerItem>
    <Value>1</Value>
  </InnerItem>
  <InnerItem>
    <Value>2</Value>
  </InnerItem>
  <InnerItem>
    <Value>3</Value>
  </InnerItem>
</InnerCollection>

我尝试使用此查询来执行此操作,但是它在元素上放置了我不想要的名称空间:

;WITH XMLNAMESPACES
(
    DEFAULT 'TestNS'
    , 'http://www.w3.org/2001/XMLSchema-instance' AS i
)
SELECT 
    X.value('Id[1]', 'INT') Id
    -- Creates a p1 namespace that I don't want.
    , X.query('InnerCollection') InnerCollection
FROM @X.nodes('//Test') AS T(X)

我的Google-fu今天不是很强大,但是我想将darn函数称为query并没有那么容易。 除了查询方法外,我愿意使用其他方法来创建该XML值。

我可以使用这种方法:

;WITH XMLNAMESPACES
(
    DEFAULT 'TestNS'
    , 'http://www.w3.org/2001/XMLSchema-instance' AS i
)
SELECT 
    X.value('Id[1]', 'INT') Id
    ,CAST(
        (SELECT 
            InnerNodes.Node.value('Value[1]', 'INT') AS 'Value'
        FROM X.nodes('./InnerCollection[1]//InnerItem') AS InnerNodes(Node) 
        FOR XML PATH('InnerItem'), ROOT('InnerCollection')
        ) AS XML) AS InnerCollection
FROM @X.nodes('//Test') AS T(X)

但这涉及调用其上的节点以将其分解为可选择的内容,然后在使用XML的情况下使用FOR XML将其选择回XML。 这似乎是一种低效的方法,所以我希望这里的某个人会有更好的主意。

这是使用查询方法执行SELECT的方法,以在我的问题正在寻找的每一行上创建XML:

;WITH XMLNAMESPACES
(
    'http://www.w3.org/2001/XMLSchema-instance' AS i
    , DEFAULT 'TestNS'
)
SELECT
    Test.Row.value('Id[1]', 'INT') Id
    , Test.Row.query('<InnerCollection xmlns="TestNS" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">{InnerCollection}</InnerCollection>')
FROM @X.nodes('/Root/Test') AS Test(Row)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM