次のクエリ。
DECLARE @uname VARCHAR(10) = 'Dom',
@pword VARCHAR(10) = 'Python',
@sntype VARCHAR(1) = 'B',
@action VARCHAR(10) = 'INSERT',
@salesContractRef VARCHAR(10) = '',
@auctionId NCHAR(10) = '';
SELECT
RTRIM(@uname) AS '@uname',
RTRIM(@pword) AS '@pword',
(SELECT
LandingId AS '@landingId',
@snType AS '@snType',
RTRIM(@action) AS '@action',
COALESCE(@salesContractRef, '') AS '@salesContractRef',
CONVERT(VARCHAR(10), DateOfPurchase, 112) AS '@saleDate',
RTRIM(COALESCE(@auctionID, '')) AS '@auctionID',
ISNULL(Logbook1 + ',', '') + ISNULL(Loogbook2 + ',', '') + ISNULL(Logbook3 + ',', '') AS '@logBookNums',
ISNULL(LandingDecNumber1 + ',', '') + ISNULL(LandingDecNumber2 + ',', '') + ISNULL(LandingDecNumber3 + ',', '') AS '@landingDecNums',
COALESCE(CONVERT(VARCHAR(10), LandingDate1, 112), '') AS '@landingDate1',
COALESCE(CONVERT(VARCHAR(10), LandingDate2, 112), '') AS '@landingDate2',
COALESCE(CONVERT(VARCHAR(10), LandingDate3, 112), '') AS '@landingDate3',
RTRIM(CountryOfLanding) AS '@countryOfLanding',
RTRIM(PortOfLanding) AS '@portOfLanding',
(SELECT
LandingDetails.LandingId AS '@landingId',
SpeciesCode AS '@speciesCode',
RTRIM(FishingArea) AS '@faoAreaCode',
RTRIM(IcesZone) AS '@ZoneCode'
FROM Landings.LandingDetails
INNER JOIN Landings.LandingHeaders lh
ON Landings.LandingDetails.LandingId = lh.LandingId
WHERE lh.Posted = 0
FOR XML PATH ('detail'), TYPE)
FROM Landings.LandingHeaders
JOIN Landings.Vessels
ON Landings.LandingHeaders.VesselId = Vessels.VesselId
WHERE Posted = 0
FOR XML PATH ('sale'), TYPE)
FOR XML PATH ('abc')
この出力を生成します。
<abc uname="Dom" pword="Python">
<sale landingId="3388" snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="L7014 ,L7015 ,L7016 ," landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
<detail landingId="3388" speciesCode="BSS" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3388" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3388" speciesCode="HER" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3389" speciesCode="SBX" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3389" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3389" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
</sale>
<sale landingId="3389" snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="" landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
<detail landingId="3388" speciesCode="BSS" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3388" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3388" speciesCode="HER" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3389" speciesCode="SBX" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3389" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
<detail landingId="3389" speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
</sale>
</abc>
これは、実際には関連する販売ラインにのみ表示されるはずの詳細ラインが両方の販売ラインで複製されているという事実を除いて、私が望んでいたのとほぼ同じです。ランディング ID を一致させることは、明らかに正しい詳細線を引き出すことです。
ありがとう
編集: SQL クエリを次のように変更しました。
DECLARE @uname VARCHAR(10) = 'Dom',
@pword VARCHAR(10) = 'Python',
@sntype VARCHAR(1) = 'B',
@action VARCHAR(10) = 'INSERT',
@salesContractRef VARCHAR(10) = '',
@auctionId NCHAR(10) = '';
SELECT
RTRIM(@uname) AS '@uname',
RTRIM(@pword) AS '@pword',
(SELECT
@snType AS '@snType',
RTRIM(@action) AS '@action',
COALESCE(@salesContractRef, '') AS '@salesContractRef',
CONVERT(VARCHAR(10), DateOfPurchase, 112) AS '@saleDate',
RTRIM(COALESCE(@auctionID, '')) AS '@auctionID',
ISNULL(Logbook1 + ',', '') + ISNULL(Loogbook2 + ',', '') + ISNULL(Logbook3 + ',', '') AS '@logBookNums',
ISNULL(LandingDecNumber1 + ',', '') + ISNULL(LandingDecNumber2 + ',', '') + ISNULL(LandingDecNumber3 + ',', '') AS '@landingDecNums',
COALESCE(CONVERT(VARCHAR(10), LandingDate1, 112), '') AS '@landingDate1',
COALESCE(CONVERT(VARCHAR(10), LandingDate2, 112), '') AS '@landingDate2',
COALESCE(CONVERT(VARCHAR(10), LandingDate3, 112), '') AS '@landingDate3',
RTRIM(CountryOfLanding) AS '@countryOfLanding',
RTRIM(PortOfLanding) AS '@portOfLanding',
(SELECT
SpeciesCode AS '@speciesCode',
RTRIM(FishingArea) AS '@faoAreaCode',
RTRIM(IcesZone) AS '@ZoneCode'
FOR XML PATH ('detail'), TYPE)
FROM Landings.LandingHeaders
INNER JOIN Landings.LandingDetails ld
ON Landings.LandingHeaders.LandingId = ld.LandingId
WHERE Posted = 0
FOR XML PATH ('sale'), TYPE)
FOR XML PATH ('abc')
次の出力が生成されます。
<abc uname="Dom" pword="Python">
<sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="L7014 ,L7015 ,L7016 ," landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
<detail speciesCode="BSS" faoAreaCode="27" ZoneCode="VIID" />
</sale>
<sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="L7014 ,L7015 ,L7016 ," landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
<detail speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
</sale>
<sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="L7014 ,L7015 ,L7016 ," landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
<detail speciesCode="HER" faoAreaCode="27" ZoneCode="VIID" />
</sale>
<sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="" landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
<detail speciesCode="SBX" faoAreaCode="27" ZoneCode="VIID" />
</sale>
<sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="" landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
<detail speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
</sale>
<sale snType="B" action="INSERT" salesContractRef="" saleDate="20130706" auctionID="" logBookNums="" landingDecNums="" landingDate1="20130705" landingDate2="" landingDate3="" countryOfLanding="GBR" portOfLanding="GBHTG">
<detail speciesCode="PLE" faoAreaCode="27" ZoneCode="VIID" />
</sale>
</abc>
少なくとも詳細行は販売行と一致していますが、詳細行ごとに個別の販売行が生成されています。明らかに小さなビットが 1 つ欠けています。Group By LandingHeaders.LandingId を試しましたが、さらに問題が発生するようです。