C#でSQLCommandを使用して、XMLを出力するローカルマシンに対してSQLを実行しています。SQLコードは次のようになります。
"SELECT
' ' AS 'ItemsCount',
' ' AS 'Shipping',
' ' AS 'Fee',
' ' AS 'ShippingPrc',
' ' AS 'FeeType',
' ' AS 'FeeTaxPrc',
//many lines of SQL omitted
FROM im_item
JOIN ps_doc_lin
ON im_item.item_no = ps_doc_lin.item_no
JOIN ps_doc_hdr
ON ps_doc_hdr.doc_id = ps_doc_lin.doc_id
JOIN ar_cust
ON ar_cust.cust_no = ps_doc_hdr.cust_no
WHERE ps_doc_hdr.tkt_dt = (SELECT Max(tkt_dt) //I select Max(tkt_dt) here because this program will run right after a customer has completed checkout. I want to get the most recent ticket (i.e. the ticket just rang up)
FROM ps_doc_hdr)
FOR xml path ('Receipt')";
これは機能していますが、最近致命的な欠陥を発見しました。データベースで顧客が複数のアイテムを購入した場合、SQL ServerからのXML出力は、購入したアイテムごとにその顧客の情報が繰り返されたXMLファイルになります。C#でXML出力を解析すると、それを実行できず、出力は複数のルート要素になります。さまざまなテーブルの結合がこれを引き起こしていると思われますが、SQLからさまざまなデータをプルする必要があり、必要なものに到達するためにこれらの結合が必要です。
私はこれに似た何かをしようとしました:
' ' AS 'Total',
' ' AS 'InvcHdrRcptStatus',
' ' AS 'InvcHdrRcptType',
' ' AS 'Cashier',
' ' AS 'DocDate',
' ' AS 'InvcNum',
(SELECT ps_doc_lin.sls_rep AS 'Clerk'
FROM PS_DOC_LIN
WHERE PS_DOC_LIN.DOC_ID = PS_DOC_HDR.DOC_ID
FOR XML PATH ('Item')) as Items,
(SELECT ar_cust.cust_no AS 'BillToCustNumber',
' ' AS 'BillToCustCompany',
ar_cust.fst_nam AS 'BillToFName',
ar_cust.lst_nam AS 'BillToLName',
ar_cust.salutation AS 'Customer/Name/Title',
ar_cust.adrs_1 AS 'BillToAddr1',
ar_cust.adrs_2 AS 'BillToAddr2',
' ' AS 'BillToAddr3',
ar_cust.zip_cod AS 'BillToZip',
' ' AS 'BillToInfo1',
' ' AS 'BillToInfo2',
' ' AS 'BillToPhone1',
' ' AS 'BillToPhone2',
ar_cust.phone_1 AS 'ShipToPhone1',
ar_cust.phone_2 AS 'ShipToPhone2' FROM AR_CUST WHERE AR_CUST.CUST_NO = PS_DOC_HDR.CUST_NO FOR XML PATH ('Customer'), TYPE) as Customers,
JOINを別の選択にネストしました。これは機能しましたが、JSONに変換すると正しくフォーマットされませんでした。出力は次のようになります。
{"Receipt":{ ......//omitted data
,"Customer":{"Name: {"title":"Mr."}}
私の意図した出力では、すべてのデータが{"Receipt"内に整理されています。別の{を使用していません。これに似ています:
"Receipt" : {
"InvcHdrNotes" : ""
"Tax" : ""
"TaxPrc" : ""
"DiscPrc" : ""
"Discount" : ""
"InvcComment1" : ""
"InvcComment2" : ""
}
「領収書」は、はるかに大きなJSONファイルのサブセクションです。ただし、この欠陥は、取得する必要のある残りのデータにも複製されます(私はそう思います)。これらのデータにもJOINが必要になるためです。JayrockとNewtonsoft.Jsonの両方を使用してみましたが、どちらにもこの問題があります。
私の目標XML出力は次のようになります。
<Receipt>
<InvcHdrNotes> </InvcHdrNotes>
<Tax>Y</Tax>
<Clerk>MGR</Clerk>
<BillToCustNumber>1000</BillToCustNumber>
<BillToCustCompany> </BillToCustCompany>
<BillToFName>Bill</BillToFName>
<BillToLName>Baker</BillToLName>
<Customer>
<Name>
<Title>Mr.</Title>
</Name>
</Customer>
<BillToAddr1>1426 Millstream Parkway</BillToAddr1>
<BillToAddr3> </BillToAddr3>
<BillToZip>38120</BillToZip>
<BillToInfo1> </BillToInfo1>
<BillToInfo2> </BillToInfo2>
<ShipToCustNumber>1000</ShipToCustNumber>
<ShipToCustCompany> </ShipToCustCompany>
<ShipToFName>Bill</ShipToFName>
<ShipToLName>Baker</ShipToLName>
<ShipToTitle>Mr.</ShipToTitle>
<ShipToAddr1>1426 Millstream Parkway</ShipToAddr1>
<ShipToZip>38120</ShipToZip>
</Receipt>
上記のSQLコードでこの出力を取得しますが、同じ情報が繰り返され、その後、前述の例外がスローされます。
これは可能ですか、それとも致命的な設計上の欠陥ですか?それが不可能な場合は、このタスクを完了する方法がわかりません。ありがとうございました。