从 SQL 服务器创建几个相同的 XML 节点

Create few the same XML nodes from SQL Server

我需要在同一个节点路径中有不同的信息,但我想将这些路径分开,为了更好地理解问题,我添加了我的代码。 以下是我的程序的一部分:

CREATE PROCEDURE [dbo].[CREATE_XML] (@ID_NO NVARCHAR(10))
AS BEGIN
SELECT 
    1 AS "Case/Client/TelephoneNumbers/TelephoneNumber/NumberTypeId",
    P.WORKTEL AS "Case/Client/TelephoneNumbers/TelephoneNumber/Number",
    2 AS "Case/Client/TelephoneNumbers/TelephoneNumber/NumberTypeId",
    P.MOBILE AS "Case/Client/TelephoneNumbers/TelephoneNumber/Number",
    3 AS "Case/Client/TelephoneNumbers/TelephoneNumber/NumberTypeId",
    P.HOMETEL AS "Case/Client/TelephoneNumbers/TelephoneNumber/Number"      
FROM 
    DETAILS AS P WHERE ID_NO = @ID_NO 
FOR XML path('Telephones')
END

实际输出如下:

<Telephones>
  <Case>
    <Client>
      <TelephoneNumbers>
        <TelephoneNumber>
          <NumberTypeId>1</NumberTypeId>
          <Number>11</Number>
          <NumberTypeId>2</NumberTypeId>
          <Number>33</Number>
          <NumberTypeId>3</NumberTypeId>
          <Number></Number>
        </TelephoneNumber>
      </TelephoneNumbers>
    </Client>
  </Case>
</Telephones>

但我需要这样的输出:

<Telephones>
  <Case>
    <Client>
      <TelephoneNumbers>
        <TelephoneNumber>
          <NumberTypeId>1</NumberTypeId>
          <Number>11</Number>
        </TelephoneNumber>
        <TelephoneNumber>
          <NumberTypeId>2</NumberTypeId>
          <Number>33</Number>
        </TelephoneNumber>
        <TelephoneNumber>
          <NumberTypeId>3</NumberTypeId>
          <Number></Number>
        </TelephoneNumber>
      </TelephoneNumbers>
    </Client>
  </Case>
</Telephones>

我怎样才能做到这一点???

经过多次尝试,我找到了解决方案,希望有一天的答案对某人有所帮助。基本上我们需要创建嵌套的 select 语句如下:

CREATE PROCEDURE [dbo].[CREATE_XML] (@ID_NO NVARCHAR(10))
AS BEGIN
SELECT   
    (SELECT 1 AS NumberTypeId,
        WORKTEL AS Number FROM DETAILS WHERE ID_NO = @ID_NO FOR XML PATH ('TelephoneNumber'), TYPE) AS "Case/Client/TelephoneNumbers", 
    (SELECT 2 AS NumberTypeId,
        MOBILE AS Number FROM DETAILS WHERE ID_NO = @ID_NO FOR XML PATH('TelephoneNumber'), TYPE) AS "Case/Client/TelephoneNumbers", 
    (SELECT 3 AS NumberTypeId,
        HOMETEL AS Number FROM DETAILS WHERE ID_NO = @ID_NO FOR XML PATH('TelephoneNumber'), TYPE) AS "Case/Client/TelephoneNumbers",      
FROM DETAILS AS P WHERE ID_NO = @ID_NO FOR XML path('Telephones')
END