我如何从存储过程中获取 select XML 元素?

How I can select XML element from Stored Procedure?

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

<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> side 是 DB 的循环结果,这意味着 1 family 有很多 child。 谢谢你。

“ModifiedBy”后面的逗号好像不对...

并且避免特定于文化的日期格式!:您的<CreatedDate>02/06/2016</CreatedDate> 可以被视为 6 月 2 日或 2 月 6 日,甚至可能会引发异常。在 XML 中使用 ISO8601

现在回答你的问题

这看起来像一个 1:n 相关的结构。但是没有关系(公用键)的提示。

如果这是一个与 1:n 相关的结构,我假设可能有多个“Fo”条目,其中 Pro 条目的数量不同。在这种情况下,最好用自己的“Pros”元素标签封装所有“Pro”元素,以将它们与其他元素分开:

在我的测试场景中,我向“tblB”添加了一列“ANumber”作为外键,并向“Fo”添加了两行,子行在“tblB”中。

此外,我添加了一个通用根,如果您的示例中只有一个“fo”元素,则您不需要它。

提示:

如果您想为“Pro”元素添加封装元素,只需将内部 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>