2016-11-04 80 views
0

我一直被困在這個問題上近2天..在最底層是我想到的,但我似乎無法得到格式正確。任何幫助將不勝感激。SQL Server XML格式

這裏的問題是:

--Axis data 
create TABLE tmpPrimaryAxisLeaves 
(
    NodeID int, 
    NodeLabel nvarchar(max) 
) 

create TABLE tmpSecondaryAxisLeaves 
(
    NodeID int, 
    NodeLabel nvarchar(max) 
) 

create TABLE tmpTertiaryAxisLeaves 
(
    NodeID int, 
    NodeLabel nvarchar(max) 
) 

INSERT INTO tmpPrimaryAxisLeaves (NodeID, NodeLabel) 
    SELECT 1, 'North America' UNION 
    SELECT 2, 'South America' UNION 
    SELECT 3, 'EU' UNION 
    SELECT 4, 'Africa' UNION 
    SELECT 5, 'Russia' 

INSERT INTO tmpSecondaryAxisLeaves (NodeID, NodeLabel) 
    SELECT 10, 'Peter Pan' UNION 
    SELECT 20, 'Groot' UNION 
    SELECT 30, 'Batman' 

INSERT INTO tmpTertiaryAxisLeaves (NodeID, NodeLabel) 
    SELECT 2, 'Shirts' UNION 
    SELECT 4, 'Pants' UNION 
    SELECT 6, 'Hats' 

--Contract data 
create table tmpContracts 
(
    StartDate datetime, 
    EndDate datetime, 
    PrimaryAxisID int, 
    SecondaryAxisID int, 
    TertiaryAxisID int, 
    LanguageID int 
) 

INSERT INTO tmpContracts (StartDate, EndDate, PrimaryAxisID, SecondaryAxisID, TertiaryAxisID, LanguageID) 
    SELECT '1/1/2010', '1/1/2018', 1, 20, 2, 1 UNION 
    SELECT '1/1/2010', '1/1/2018', 1, 20, 2, 2 UNION 
    SELECT '1/1/2010', '1/1/2018', 1, 20, 2, 5 UNION 
    SELECT '1/1/2010', '1/1/2018', 1, 20, 6, 1 UNION 
    SELECT '1/1/2010', '1/1/2018', 1, 20, 6, 2 UNION 
    SELECT '1/1/2010', '1/1/2018', 1, 20, 6, 5 UNION 
    SELECT '1/1/2011', '1/1/2020', 2, 20, 2, 1 UNION 
    SELECT '1/1/2011', '1/1/2020', 2, 20, 2, 3 UNION 
    SELECT '1/1/2011', '1/1/2020', 2, 20, 4, 1 UNION 
    SELECT '1/1/2011', '1/1/2020', 2, 20, 4, 3 UNION 
    SELECT '1/1/2011', '1/1/2020', 2, 20, 4, 5 UNION 
    SELECT '1/1/2011', '1/1/2020', 3, 30, 2, 1 UNION 
    SELECT '1/1/2011', '1/1/2020', 4, 30, 6, 1 

--Langauges 
create table tmpLanguages 
(
    LanguageID int, 
    Name nvarchar(100) 
) 

INSERT INTO tmpLanguages 
    SELECT 1, 'English' UNION 
    SELECT 2, 'Spanish' UNION 
    SELECT 3, 'French' UNION 
    SELECT 4, 'Russia' UNION 
    SELECT 5, 'Dutch' 

寫一個查詢,將採取上述數據,並在下面的格式與在指示的每個位置(「[XXXXX]」)的正確值返回XML結果謹這個:

<AvailabiltyList> 
    <PrimaryNode> 
    <NodeID>[PrimaryAxis.NodeID]</NodeID> 
    <NodeLabel>[PrimaryAxis.NodeLabel]</NodeLabel> 
    <SecondaryAxis> 
     <SecondaryNode> 
     <NodeID>[SecondaryAxis.NodeID]</NodeID> 
     <NodeLabel>[SecondaryAxis.NodeLabel]</NodeLabel> 
     <TertiaryAxis> 
      <TertiaryNode> 
      <NodeID>[TertiaryAxis.NodeID]</NodeID> 
      <NodeLabel>[TertiaryAxis.NodeLabel]</NodeLabel> 
      <ContractData> 
       <ContractDataPoint> 
       <ContractStart>[Contracts.StartDate]</ContractStart> 
       <ContractEnd>[Contracts.EndDate]</ContractEnd> 
       </ContractDataPoint> 
      </ContractData> 
      <Languages>[Comma delimited list of languages for the matching contracts]</Languages> 
      </TertiaryNode> 
      <TertiaryNode>....</TertiaryNode> 
      <TertiaryNode>....</TertiaryNode> 
      <TertiaryNode>....</TertiaryNode> 
     </TertiaryAxis> 
     </SecondaryNode> 
     <SecondaryNode>...</SecondaryNode> 
     <SecondaryNode>...</SecondaryNode> 
     <SecondaryNode>...</SecondaryNode> 
     <SecondaryNode>...</SecondaryNode> 
    </PrimaryNode> 
    <PrimaryNode>...</PrimaryNode> 
    <PrimaryNode>...</PrimaryNode> 
    <PrimaryNode>...</PrimaryNode> 
</AvailabilityList> 

這是我想到的..但我似乎無法得到格式正確。

select 
    PrimaryNode.NodeID as pnode, 
    PrimaryNode.NodeLabel as plabel, 
    SecondaryNode.NodeID as snode, 
    SecondaryNode.NodeLabel as slabel, 
    TertiaryNode.NodeID as tnode, 
    TertiaryNode.NodeLabel as tlable, 
    ContractDataPoint.StartDate, 
    ContractDataPoint.EndDate 
from 
    tmpContracts ContractDataPoint 
left join 
    tmpPrimaryAxisLeaves PrimaryNode on ContractDataPoint.PrimaryAxisID = PrimaryNode.NodeID 
inner join 
    tmpSecondaryAxisLeaves SecondaryNode on  ContractDataPoint.SecondaryAxisID = SecondaryNode.NodeID 
inner join 
    tmpTertiaryAxisLeaves TertiaryNode on  ContractDataPoint.TertiaryAxisID = TertiaryNode.NodeID 
group by 
    PrimaryNode.NodeID, PrimaryNode.NodeLabel, 
    SecondaryNode.NodeID, SecondaryNode.NodeLabel, 
    TertiaryNode.NodeID, TertiaryNode.NodeLabel, 
    ContractDataPoint.StartDate, ContractDataPoint.EndDate 
for xml auto, Root('AvailabiltyList'), Elements 

我的結果:

<AvailabiltyList> 
    <PrimaryNode> 
     <pnode>1</pnode> 
     <plabel>North America</plabel> 
     <SecondaryNode> 
      <snode>20</snode> 
      <slabel>Groot</slabel> 
     <TertiaryNode> 
     <tnode>2</tnode> 
     <tlable>Shirts</tlable> 
     <ContractDataPoint> 
      <StartDate>2010-01-01T00:00:00</StartDate> 
      <EndDate>2018-01-01T00:00:00</EndDate> 
     </ContractDataPoint> 
     </TertiaryNode> 
     <TertiaryNode> 
     <tnode>6</tnode> 
     <tlable>Hats</tlable> 
     <ContractDataPoint> 
      <StartDate>2010-01-01T00:00:00</StartDate> 
      <EndDate>2018-01-01T00:00:00</EndDate> 
     </ContractDataPoint> 
     </TertiaryNode> 
    </SecondaryNode> 
    </PrimaryNode> 
    <PrimaryNode> 
    <pnode>2</pnode> 
    <plabel>South America</plabel> 
    <SecondaryNode> 
     <snode>20</snode> 
     <slabel>Groot</slabel> 
     <TertiaryNode> 
     <tnode>2</tnode> 
     <tlable>Shirts</tlable> 
     <ContractDataPoint> 
      <StartDate>2011-01-01T00:00:00</StartDate> 
      <EndDate>2020-01-01T00:00:00</EndDate> 
     </ContractDataPoint> 
     </TertiaryNode> 
     <TertiaryNode> 
     <tnode>4</tnode> 
     <tlable>Pants</tlable> 
     <ContractDataPoint> 
      <StartDate>2011-01-01T00:00:00</StartDate> 
      <EndDate>2020-01-01T00:00:00</EndDate> 
     </ContractDataPoint> 
     </TertiaryNode> 
    </SecondaryNode> 
    </PrimaryNode> 
    <PrimaryNode> 
    <pnode>3</pnode> 
    <plabel>EU</plabel> 
    <SecondaryNode> 
     <snode>30</snode> 
     <slabel>Batman</slabel> 
     <TertiaryNode> 
     <tnode>2</tnode> 
     <tlable>Shirts</tlable> 
     <ContractDataPoint> 
      <StartDate>2011-01-01T00:00:00</StartDate> 
      <EndDate>2020-01-01T00:00:00</EndDate> 
     </ContractDataPoint> 
     </TertiaryNode> 
    </SecondaryNode> 
    </PrimaryNode> 
    <PrimaryNode> 
    <pnode>4</pnode> 
    <plabel>Africa</plabel> 
    <SecondaryNode> 
     <snode>30</snode> 
     <slabel>Batman</slabel> 
     <TertiaryNode> 
     <tnode>6</tnode> 
     <tlable>Hats</tlable> 
     <ContractDataPoint> 
      <StartDate>2011-01-01T00:00:00</StartDate> 
      <EndDate>2020-01-01T00:00:00</EndDate> 
     </ContractDataPoint> 
     </TertiaryNode> 
    </SecondaryNode> 
    </PrimaryNode> 
</AvailabiltyList> 
+0

您能顯示所需的輸出格式嗎?到底什麼是錯誤的? – Fiddles

+0

你好......我剛剛添加了它應該看起來像上面的那樣......結果應該看起來像這樣 – tbailey922

回答

0

你可以嘗試這樣的事情

創建UDF獲得語言

CREATE FUNCATION udfAxisLanguage 
(@pNodeId INT 
,@sNodeId INT 
,@tNodeId INT 
) 
RETURNS VARCHAR(100) 
AS 
BEGIN 
DECLARE @retLang VARCHAR(100) 
select 
    @retLang = COALESCE(@retLang + ',','') + lang.name 
from 
    tmpContracts ContractDataPoint 
left join 
    tmpPrimaryAxisLeaves PrimaryNode on ContractDataPoint.PrimaryAxisID = PrimaryNode.NodeID 
inner join 
    tmpSecondaryAxisLeaves SecondaryNode on  ContractDataPoint.SecondaryAxisID = SecondaryNode.NodeID 
inner join 
    tmpTertiaryAxisLeaves TertiaryNode on  ContractDataPoint.TertiaryAxisID = TertiaryNode.NodeID 
inner join tmpLanguages lang on ContractDataPoint.languageid = lang.languageId 
WHERE PrimaryNode.NodeID = @pNodeId 
AND SecondaryNode.NodeID = @sNodeId 
AND TertiaryNode.NodeID = @tNodeId 
; 

RETURN @retLang ; 
END ; 

現在使用上述UDF中你的查詢,像這樣

select 
    PrimaryNode.NodeID as pnode, 
    PrimaryNode.NodeLabel as plabel, 
    SecondaryNode.NodeID as snode, 
    SecondaryNode.NodeLabel as slabel, 
    TertiaryNode.NodeID as tnode, 
    TertiaryNode.NodeLabel as tlable, 
    ContractDataPoint.StartDate, 
    ContractDataPoint.EndDate, 
    dbo.udfAxisLanguage(PrimaryNode.NodeID,SecondaryNode.NodeID,TertiaryNode.NodeID) Name 
from 
    tmpContracts ContractDataPoint 
left join 
    tmpPrimaryAxisLeaves PrimaryNode on ContractDataPoint.PrimaryAxisID = PrimaryNode.NodeID 
inner join 
    tmpSecondaryAxisLeaves SecondaryNode on  ContractDataPoint.SecondaryAxisID = SecondaryNode.NodeID 
inner join 
    tmpTertiaryAxisLeaves TertiaryNode on  ContractDataPoint.TertiaryAxisID = TertiaryNode.NodeID 
group by 
    PrimaryNode.NodeID, PrimaryNode.NodeLabel, 
    SecondaryNode.NodeID, SecondaryNode.NodeLabel, 
    TertiaryNode.NodeID, TertiaryNode.NodeLabel, 
    ContractDataPoint.StartDate, ContractDataPoint.EndDate 
    ,dbo.udfAxisLanguage(PrimaryNode.NodeID,SecondaryNode.NodeID,TertiaryNode.NodeID) 
for xml auto, Root('AvailabiltyList'), Elements