Sql server SQL Server FOR XML与嵌套子选择

Sql server SQL Server FOR XML与嵌套子选择,sql-server,xml,Sql Server,Xml,下面是sql代码 SELECT b.GivenName [Individual/Name/FirstName] , b.FamilyName [Individual/Name/LastName] , b.Address_Country [Individual/Address/CountryCode] , b.AddressFree [Individual/Address/AddressFree] FROM dbo.stage_Clients_Merge b WHERE b.DWHCl

下面是sql代码

SELECT  
 b.GivenName [Individual/Name/FirstName] ,
 b.FamilyName [Individual/Name/LastName] ,
 b.Address_Country [Individual/Address/CountryCode] ,
 b.AddressFree [Individual/Address/AddressFree]
FROM dbo.stage_Clients_Merge b
WHERE b.DWHClientNo = @dwhclientNo
FOR XML PATH('Owner'), TYPE
将生成一个xml片段

<Owner>
 <Individual>
  <Name>
   <FirstName>Bob</FirstName>
   <LastName>Smith</LastName>
  </Name>
  <Address>
    <CountryCode>US</CountryCode>
    <AddressFree>123,Utah</AddressFree>
  </Address>
 </Individual>
</Owner>
我将获得个人部分两次。如何将这两者结合起来返回以下内容

<Owner>
 <Individual>
  <OrderNo>12345</OrderNo>
  <OrderNo>23456</OrderNo>
   <Name>
    <FirstName>Bob</FirstName>
    <LastName>Smith</LastName>
   </Name>
   <Address>
    <CountryCode>US</CountryCode>
    <AddressFree>123,Utah</AddressFree>
  </Address>
 </Individual>
</Owner>

12345
23456
上下快速移动
史密斯
美国
犹他州123号

您可以使用子查询和
[data()]
只获取列值,而无需额外嵌套-然后像以前一样使用
路径

SELECT  
    (SELECT      c.OrderIdentificationNumber as [data()]
     FROM dbo.stage_Customer_Orders c
     WHERE c.CustomerNo = b.masterClient
     For XML Path('OrderNo'), type) as [Individual],
     b.GivenName [Individual/Name/FirstName] ,
     b.FamilyName [Individual/Name/LastName] ,
     b.Address_Country [Individual/Address/CountryCode] ,
     b.AddressFree [Individual/Address/AddressFree]
FROM dbo.stage_Clients_Merge b
WHERE b.DWHClientNo = @dwhclientNo
FOR XML PATH('Owner'), TYPE
像这样试试

我为独立解决方案建立了一个模拟场景。下次你有问题的时候,你可以自己试试这个。这使您更容易理解您的问题,并为其创建一个完全有效且可测试的解决方案

DECLARE @stage_Clients_Merge TABLE(ID INT,FirstName VARCHAR(100),LastName VARCHAR(100),CountryCode VARCHAR(100),AdressFree VARCHAR(100));
INSERT INTO @stage_Clients_Merge VALUES
 (1,'Bob','Smith','US','123/Utah')
,(2,'Jim','Doh','US','123/Maryland');


DECLARE @orders TABLE(CustomerID INT, OrderNo INT)
INSERT INTO @orders VALUES
 (1,11111),(1,12222)
,(2,21111),(2,22222);

SELECT (SELECT OrderNo FROM @orders WHERE CustomerID=b.ID FOR XML PATH(''),TYPE) AS Individual
      ,FirstName AS [Individual/Name/FirstName]
      ,LastName AS [Individual/Name/LastName]
      ,CountryCode AS [Individual/Address/CountryCode]
      ,AdressFree AS [Individual/Address/AdressFree] 
FROM @stage_Clients_Merge AS b
FOR XML PATH('Owner');

你比我快,+1
DECLARE @stage_Clients_Merge TABLE(ID INT,FirstName VARCHAR(100),LastName VARCHAR(100),CountryCode VARCHAR(100),AdressFree VARCHAR(100));
INSERT INTO @stage_Clients_Merge VALUES
 (1,'Bob','Smith','US','123/Utah')
,(2,'Jim','Doh','US','123/Maryland');


DECLARE @orders TABLE(CustomerID INT, OrderNo INT)
INSERT INTO @orders VALUES
 (1,11111),(1,12222)
,(2,21111),(2,22222);

SELECT (SELECT OrderNo FROM @orders WHERE CustomerID=b.ID FOR XML PATH(''),TYPE) AS Individual
      ,FirstName AS [Individual/Name/FirstName]
      ,LastName AS [Individual/Name/LastName]
      ,CountryCode AS [Individual/Address/CountryCode]
      ,AdressFree AS [Individual/Address/AdressFree] 
FROM @stage_Clients_Merge AS b
FOR XML PATH('Owner');