【问题标题】:How I can select XML element from Stored Procedure?如何从存储过程中选择 XML 元素?
【发布时间】:2016-08-01 07:06:59
【问题描述】:

这是我需要在 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('')

大家好,我可以获取显示结果的示例脚本吗? &lt;Pro&gt; 边是从 DB 循环的结果,这意味着 1 个家庭有很多孩子。 谢谢你。

【问题讨论】:

    标签: xml sqlxml


    【解决方案1】:

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

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

    现在回答你的问题

    这看起来像一个 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>
    

    【讨论】:

    • 亲爱的@Shnugo:注意到并感谢..但我再次有1个问题,关于1个案例有很多属性,我该如何解决??
    • 如果我必须加入超过 5 个表,我该如何区分??
    • 嗨@KHLIM,关于 SO 的一个原则是:一个问题 - 一个问题。如果这个问题(我如何选择 XML 元素...)得到解决,我请您点击投票,另外点击投票计数器下方的接受检查。这会将这个问题标记为已解决,并为您和我的帐户带来积分。然后开始一个新问题并在此处放置一个链接。我很快就会出现在那里:-) 请:试着像一个不知道你想要什么的人一样思考!放置示例数据,显示您尝试过的内容并说明预期的输出。 超过5个表我怎么区分??对我来说毫无意义...
    • 亲爱的@Shnugo:我可以有你的电子邮件地址吗,例如:我有 1 个案例有很多拍卖,其中一个拍卖有超过 1 个财产.. 现在我尝试区分止赎部分,所以显示 2 条记录..但在属性部分我无法显示它..
    • 亲爱的@KHLIM,SO 是一个公共平台......每个人都可以贡献并从所有答案中获利。为什么要私下讨论这个?什么反对一个新的问题?新问题最吸引人!看看我的答案,我是如何声明表变量并用示例数据填充它们的。尝试以这种方式设置一个最小的示例以及您想从中获得什么。提出一个的问题,你会在几分钟内得到答案...
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    相关资源
    最近更新 更多