如何从存储过程中选择XML元素?

时间:2016-08-01 07:06:59

标签: xml sqlxml

这是我需要在SQL服务器生成的XML中显示的输出:

<Fo>
    <Number>1</Number>
    <CreatedDate>02/06/2016</CreatedDate>
    <CreatedBy>1</CreatedBy>
    <ModifiedDate>02/06/2016</ModifiedDate>
    <ModifiedBy>1</ModifiedBy>,
            <Pro>
                <Number>1</Number>
                <LotNumber>Lot 1288</LotNumber>
            </Pro>
            <Pro>
                <Number>2</Number>
                <LotNumber>Lot 1299</LotNumber>
            </Pro>
            <Pro>
                <Number>3</Number>
                <LotNumber>Lot 1211</LotNumber>
            </Pro>
</Fo>

这是我尝试的代码,但仍然无法显示结果。

SELECT *
    (SELECT * FROM TAB_B FOR XML PATH(''))
FROM TBL_A
FOR XML PATH('')

大家好,我可以获取示例脚本来显示结果吗? <Pro>方是来自DB的循环结果,这意味着1个家庭有很多孩子。 谢谢。

1 个答案:

答案 0 :(得分:1)

&#34; ModifiedBy&#34;之后的逗号;似乎是不正确的......

避免使用特定于文化的日期格式!:您的<CreatedDate>02/06/2016</CreatedDate>可能会被视为6月2日或2月6日,甚至可能会引发异常。在XML中使用ISO8601in SQL you should prefer ODBC, ISO or Universal-Unseparated

现在回答你的问题

这看起来像1:n相关的结构。但是没有暗示关系(共同密钥)。

如果这是1:n相关的结构,我假设可能有几个&#34; Fo&#34;具有不同Pro项的条目。在这种情况下,最好将所有&#34; Pro&#34;具有自己的&#34; Pros&#34; -element标记的元素将它们与其余元素分开:

在我的测试场景中,我添加了一个专栏&#34; ANumber&#34;到&#34; tblB&#34;作为外键并添加两行到&#34; Fo&#34;在&#34; tblB&#34;。

中包含子行

此外,我添加了一个你不需要的通用root,如果只有一个&#34; fo&#34;元素如你的例子。

提示:

如果你想为你的&#34; Pro&#34;添加封装元素。元素,只需将内部SELECT更改为FOR XML PATH('Pro'),ROOT('Pros'),TYPE

实施例

DECLARE @tblA TABLE(Number INT,CreatedDate DATETIME,CreatedBy INT,ModifiedDate DATETIME,ModifiedBy INT);
INSERT INTO @tblA VALUES
 (1,{d'2016-06-02'},1,{d'2016-06-02'},1)
,(2,{d'2016-07-02'},1,{d'2016-07-02'},1);

DECLARE @tblB TABLE(Number INT, ANumber INT,LotNumber VARCHAR(100));
INSERT INTO @tblB VALUES
 (1,1,'Lot 1288')
,(2,1,'Lot 1299')
,(3,1,'Lot 1211')
,(1,2,'Lot 222a')
,(2,2,'Lot 222b');

SELECT tblA.*
      ,(
        SELECT tblB.Number
              ,tblB.LotNumber
        FROM @tblB AS tblB 
        WHERE tblB.ANumber=tblA.Number
        FOR XML PATH('Pro'),TYPE
       )
FROM @tblA AS tblA
FOR XML PATH('Fo'),ROOT('root')

结果

<root>
  <Fo>
    <Number>1</Number>
    <CreatedDate>2016-06-02T00:00:00</CreatedDate>
    <CreatedBy>1</CreatedBy>
    <ModifiedDate>2016-06-02T00:00:00</ModifiedDate>
    <ModifiedBy>1</ModifiedBy>
    <Pro>
      <Number>1</Number>
      <LotNumber>Lot 1288</LotNumber>
    </Pro>
    <Pro>
      <Number>2</Number>
      <LotNumber>Lot 1299</LotNumber>
    </Pro>
    <Pro>
      <Number>3</Number>
      <LotNumber>Lot 1211</LotNumber>
    </Pro>
  </Fo>
  <Fo>
    <Number>2</Number>
    <CreatedDate>2016-07-02T00:00:00</CreatedDate>
    <CreatedBy>1</CreatedBy>
    <ModifiedDate>2016-07-02T00:00:00</ModifiedDate>
    <ModifiedBy>1</ModifiedBy>
    <Pro>
      <Number>1</Number>
      <LotNumber>Lot 222a</LotNumber>
    </Pro>
    <Pro>
      <Number>2</Number>
      <LotNumber>Lot 222b</LotNumber>
    </Pro>
  </Fo>
</root>