Sql server SQL Server FOR XML与嵌套子选择
下面是sql代码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
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');