結局、これに答えました-XML明示を使用しなければならない他の不幸な魂を助ける場合に備えて、以下に概説します:)
以下に含まれる XML を出力する次のコードがあります。私が直面している問題は、各request_status_updateセクションにshipping_infoおよびassociated_pin_padセクションが 1 つずつあるはずですが、それらはすべて最後のrequest_status_updateのみに表示されるということです。
代わりに、XML PATH を使用してこの種のネストを行う方法を誰かが教えてくれれば、その方が簡単かもしれません。私も大賛成です。1 つのヘッダー セクションを取得する方法がわかりませんでしたが、それでも複数の request_status_update セクションを取得できませんでした。XML PATH は、ヘッダー セクションだけではなく、常に行ごとに何かを行うことを期待しているようです。
これについて何か助けてくれてありがとう。私はそれが長いコードであることを知っています(それについて申し訳ありません)
SQL コード:
SELECT
1 AS Tag
, null AS Parent
, 2 as 'process_document!1!version'
, null as 'header!2!'
, null as 'header!2!sender!Element'
, null as 'header!2!receiver!Element'
, null as 'header!2!creation_dt!Element'
, null as 'request_status_updates!3!'
, null as 'request_status_update!4!request_id!Element'
, null as 'request_status_update!4!status_code_id!Element'
, null as 'request_status_update!4!status_reason_code_id!Element'
, null as 'request_status_update!4!comments!Element'
, null as 'request_status_update!4!serialnumber!Element'
, null as 'associated_pin_pad!5!'
, null as 'associated_pin_pad!5!device_type_id!Element'
, null as 'associated_pin_pad!5!serialnumber!Element'
, null as 'shipping_info!6!'
, null as 'shipping_info!6!shipping_method_id!Element'
, null as 'shipping_info!6!shipping_dt!Element'
, null as 'shipping_info!6!shipping_no!Element'
, null as 'shipping_info!6!shipped_with!Element'
union all
-- header element
select
2 as Tag
, 1 as Parent
, null
, null
, 'SENDER'
, 'RECIPIENT'
, getdate()
, null -- request status updates wrapper tag
, null -- request status update wrapper tag
, null -- request status update element 1
, null -- request status update element 2
, null -- request status update element 3
, null -- request status update element 4
, null -- pinpad wrapper tag
, null -- pinpad element 1
, null -- pinpad element 2
, null -- shipping wrapper tag
, null -- shipping element 1
, null -- shipping element 2
, null -- shipping element 3
, null -- shipping element 4
union all
select
3 as Tag
, 1 as Parent
, null
, null
, null
, null
, null
, null -- request status updates wrapper tag
, null -- request status update wrapper tag
, null -- request status update element 1
, null -- request status update element 2
, null -- request status update element 3
, null -- request status update element 4
, null -- pinpad wrapper tag
, null -- pinpad element 1
, null -- pinpad element 2
, null -- shipping wrapper tag
, null -- shipping element 1
, null -- shipping element 2
, null -- shipping element 3
, null -- shipping element 4
union all
-- request status update element
select
4 as Tag
, 3 as Parent
, null
, null -- header element wrapper tag
, null -- header element 1
, null -- header element 2
, null -- header element 3
, null -- request status updates wrapper tag
, RequestID
, StatusCodeID
, StatusReasonCodeID
, Comment
, SerialNumber
, null -- pinpad wrapper tag
, null -- pinpad element 1
, null -- pinpad element 2
, null -- shipping wrapper tag
, null -- shipping element 1
, null -- shipping element 2
, null -- shipping element 3
, null -- shipping element 4
from dbo.usr_StatusUpdate u
union all
-- Get pinpad information
select
5 as Tag
, 4 as Parent
, null
, null -- header element wrapper tag
, null -- header element 1
, null -- header element 2
, null -- header element 3
, null -- request status updates wrapper tag
, null -- request status update wrapper tag
, null -- request status update element 1
, null -- request status update element 2
, null -- request status update element 3
, null -- request status update element 4
, null -- pinpad wrapper tag
, 'PHRSA' -- placeholder until we get the device type table set
, ltrim(rtrim(dp.CONTSERIALNBR))
, null -- shipping wrapper tag
, null -- shipping element 1
, null -- shipping element 2
, null -- shipping element 3
, null -- shipping element 4
from dbo.usr_StatusUpdate up
inner join dbo.SOP30300 dp on dp.SOPNUMBE = up.SOPNUMBE
where dp.ITEMNMBR like '%PINPAD%'
union all
-- Get shipping information
select
6 as Tag
, 4 as Parent
, null
, null -- header element wrapper tag
, null -- header element 1
, null -- header element 2
, null -- header element 3
, null -- request status updates wrapper tag
, null -- request status update wrapper tag
, null -- request status update element 1
, null -- request status update element 2
, null -- request status update element 3
, null -- request status update element 4
, null -- pinpad wrapper tag
, null -- pinpad element 1
, null -- pinpad element 2
, null -- shipping main container
, ltrim(rtrim(sh.SHIPMTHD)) -- shipping element 1
, sh.ACTLSHIP -- shipping element 2
, null -- shipping element 3
, null -- shipping element 4
from dbo.usr_StatusUpdate sp
inner join dbo.SOP30200 sh on sh.SOPNUMBE = sp.SOPNUMBE
FOR XML explicit
XML OUTPUT: (これは問題領域であるため、request_status_updates セクションのみが含まれています。
<process_document version="2">
<header>
<sender>SENDER</sender>
<receiver>RECIPIENT</receiver>
<creation_dt>2013-05-10T10:24:08.593</creation_dt>
</header>
<request_status_updates>
<request_status_update>
<request_id>2016582</request_id>
<status_code_id>CMPLT</status_code_id>
<status_reason_code_id>COMPLT</status_reason_code_id>
<comments>Test request status update interface.</comments>
<serialnumber>123456</serialnumber>
</request_status_update>
<request_status_update>
<request_id>2016583</request_id>
<status_code_id>CMPLT</status_code_id>
<status_reason_code_id>COMPLT</status_reason_code_id>
<comments>Test request status update interface.</comments>
<serialnumber>123457</serialnumber>
<associated_pin_pad>
<device_type_id>PHRSA</device_type_id>
<serialnumber>30500835-AC812195</serialnumber>
</associated_pin_pad>
<associated_pin_pad>
<device_type_id>PHRSA</device_type_id>
<serialnumber>30501048-ac013910</serialnumber>
</associated_pin_pad>
<shipping_info>
<shipping_method_id>OTHER</shipping_method_id>
<shipping_dt>2013-04-24T00:00:00</shipping_dt>
</shipping_info>
<shipping_info>
<shipping_method_id>OTHER</shipping_method_id>
<shipping_dt>2012-08-30T00:00:00</shipping_dt>
</shipping_info>
</request_status_update>
</request_status_updates>
</process_document>
期待される出力:
<request_status_updates>
<request_status_update>
<request_id>2016582</request_id>
<status_code_id>CMPLT</status_code_id>
<status_reason_code_id>COMPLT</status_reason_code_id>
<comments>Test request status update interface.</comments>
<serialnumber>123456</serialnumber>
<associated_pin_pad>
<device_type_id>PHRSA</device_type_id>
<serialnumber>30501048-ac013910</serialnumber>
</associated_pin_pad>
<shipping_info>
<shipping_method_id>OTHER</shipping_method_id>
<shipping_dt>2013-04-24T00:00:00</shipping_dt>
</shipping_info>
</request_status_update>
<request_status_update>
<request_id>2016583</request_id>
<status_code_id>CMPLT</status_code_id>
<status_reason_code_id>COMPLT</status_reason_code_id>
<comments>Test request status update interface.</comments>
<serialnumber>123457</serialnumber>
<associated_pin_pad>
<device_type_id>PHRSA</device_type_id>
<serialnumber>30500835-AC812195</serialnumber>
</associated_pin_pad>
<shipping_info>
<shipping_method_id>OTHER</shipping_method_id>
<shipping_dt>2012-08-30T00:00:00</shipping_dt>
</shipping_info>
</request_status_update>
</request_status_updates>
修理:
この order by 句を追加する必要がありました。
order by [request_status_update!4!request_id!Element], Tag
さらに、Tag 4 のクエリから始めて、並べ替えが機能するように、NULL ではなく RequestID が実際に結果に含まれていることを確認する必要がありました。
また、XML EXPLICIT よりも単純であるはずの XML PATH を使用することも検討しますが、これまでのところ、これは機能しています。