Sql server SQL Server FOR XML行组合行
我最初试图在C#中实现这一点,并放弃了该路径进行查询。我有一个表(SiteTest),其中一列名为“SiteID”,另一列名为“Services” 然后,我创建一些临时表,并在“服务”列上使用交叉应用来获得: 我现在尝试使用FOR XML:Sql server SQL Server FOR XML行组合行,sql-server,xml,tsql,Sql Server,Xml,Tsql,我最初试图在C#中实现这一点,并放弃了该路径进行查询。我有一个表(SiteTest),其中一列名为“SiteID”,另一列名为“Services” 然后,我创建一些临时表,并在“服务”列上使用交叉应用来获得: 我现在尝试使用FOR XML: SELECT ProviderName ,SiteID ,SiteName ,( SELECT Services AS [CoveredServiceCode] FROM
SELECT
ProviderName
,SiteID
,SiteName
,(
SELECT
Services AS [CoveredServiceCode]
FROM
ProviderSiteTestTable AS [CoveredService]
FOR XML AUTO, TYPE, ELEMENTS, ROOT('CoveredServices')
)
FROM
ProviderSiteTestTable AS [ProviderSite]
FOR XML AUTO, TYPE, ELEMENTS, ROOT('ProviderSites')
然后我得到:
<ProviderSites>
<ProviderSite>
<ProviderName>Health Center USA</ProviderName>
<SiteID>15</SiteID>
<SiteName>Texas Behavioral Health LLC</SiteName>
<CoveredServices>
<CoveredService>04</CoveredService>
</CoveredServices>
</ProviderSite>
<ProviderSite>
<ProviderName>Health Center USA</ProviderName>
<SiteID>15</SiteID>
<SiteName>Texas Behavioral Health LLC</SiteName>
<CoveredServices>
<CoveredService>08</CoveredService>
</CoveredServices>
</ProviderSite>
....
....
</ProviderSites>
美国健康中心
15
德克萨斯行为健康有限公司
04
美国健康中心
15
德克萨斯行为健康有限公司
08
....
....
我试图获取的结果(该站点下该站点的所有“CoveredServices”):
美国健康中心
15
德克萨斯行为健康有限公司
04
08
....
....
....
更新
看起来我要找的可能是一个小组,
现在测试此功能您可以尝试以下操作:
DECLARE @mockup TABLE(ID INT, ProviderID VARCHAR(100),ProviderName VARCHAR(100),SiteID INT,SiteName VARCHAR(100),OpenDate DATE,[Services] VARCHAR(10));
INSERT INTO @mockup VALUES
(1,'12-000000','Health Center USA',15,'Texas blah','20120107','04')
,(1,'12-000000','Health Center USA',15,'Texas blah','20120107','08')
,(2,'12-000000','Health Center USA',15,'Texas blah','20120107','ab')
,(2,'12-000000','Health Center USA',15,'Texas blah','20120107','cd');
SELECT tbl.ProviderName
,tbl.ID
,tbl.SiteName
,(
SELECT tbl2.[services] AS CoveredService
FROM @mockup tbl2
WHERE tbl2.ID=tbl.ID --correlated sub-query
FOR XML PATH(''),TYPE
) AS CoveredServices
FROM @mockup tbl
GROUP BY tbl.ProviderName,tbl.ID,tbl.SiteName --Control the final Site-Order here...
FOR XML PATH('ProviderSite'),ROOT('ProviderSites');
结果
<ProviderSites>
<ProviderSite>
<ProviderName>Health Center USA</ProviderName>
<ID>1</ID>
<SiteName>Texas blah</SiteName>
<CoveredServices>
<CoveredService>04</CoveredService>
<CoveredService>08</CoveredService>
</CoveredServices>
</ProviderSite>
<ProviderSite>
<ProviderName>Health Center USA</ProviderName>
<ID>2</ID>
<SiteName>Texas blah</SiteName>
<CoveredServices>
<CoveredService>ab</CoveredService>
<CoveredService>cd</CoveredService>
</CoveredServices>
</ProviderSite>
</ProviderSites>
样本数据最好作为+。请将您的问题包括在内,您当前的尝试和您想要的结果。欲知详情,,
<ProviderSites>
<ProviderSite>
<ProviderName>Health Center USA</ProviderName>
<ID>1</ID>
<SiteName>Texas blah</SiteName>
<CoveredServices>
<CoveredService>04</CoveredService>
<CoveredService>08</CoveredService>
</CoveredServices>
</ProviderSite>
<ProviderSite>
<ProviderName>Health Center USA</ProviderName>
<ID>2</ID>
<SiteName>Texas blah</SiteName>
<CoveredServices>
<CoveredService>ab</CoveredService>
<CoveredService>cd</CoveredService>
</CoveredServices>
</ProviderSite>
</ProviderSites>
DECLARE @mockup TABLE(ID INT, ProviderID VARCHAR(100),ProviderName VARCHAR(100),SiteID INT,SiteName VARCHAR(100),OpenDate DATE,[Services] VARCHAR(100));
INSERT INTO @mockup VALUES
(1,'12-000000','Health Center USA',15,'Texas blah','20120107','04,08,01,02')
,(2,'12-000000','Health Center USA',15,'Texas blah','20120107','04,08,02,12')
SELECT tbl.ProviderName
,tbl.ID
,tbl.SiteName
,CAST('<CoveredService>' + REPLACE([services],',','</CoveredService><CoveredService>') + '</CoveredService>' AS XML) AS CoveredServices
FROM @mockup tbl
FOR XML PATH('ProviderSite'),ROOT('ProviderSites');