XML 열 출력
Sep 17 2020
SQL Server 데이터베이스와 .NET을 사용하여 XML 파일을 생성하는 콘솔 프로그램에서 작업 중입니다.
현재 저는 적절한 XML 파일을 생성하는 코드를 고수하고 있습니다. Categories메모장에서 파일을 열 때 내 노드가 XML 형식으로 제대로 식별되지 않아서 잘 사용할 수 없습니다.
필요한 것은 다음과 같습니다.
Categories아래와 같이 적절한 XML 태그를 생성하고 메모장에서 열 때 특수 문자를 포함하지 않아야합니다.여러 사이트 ID (위치)가있는 경우 SQL 테이블에서 내 코드에 대해 for 루프를 수행하는 방법은 무엇입니까?
Dim dsXmlDoc As XmlDocument = New XmlDocument() ds.Tables(0).TableName = "Inv" dsXmlDoc.LoadXml(ds.GetXml()) Dim xmlInner As XmlElement = CType(xmlDoc.SelectSingleNode("/Root/"), XmlElement)xmlInner.AppendChild(xmlDoc.ImportNode(dsXmlDoc.DocumentElement, True))
답변
1 CaiusJard Sep 17 2020 at 14:51
나는 이것이 될 것이라고 생각한다.
WITH x AS (
SELECT
A.[ORDER ID],
RIGHT(A.[POS ID], 2) AS [LesseePOSNumber],
REPLACE(A.[BUSINESS DATE],'-','') + '-' + A.[RECEIPT NUMBER] AS [InvoiceNumber],
'1' AS [DocumentType],
CAST(A.[BUSINESS DATE] AS datetime) + CAST(A.[START SALE TIME] AS DATETIME) AS [TransactionDateTime],
SUM(A.ITEM) AS [TotalNumberOfItems],
SUM(A.[TOTAL AMOUNT] - A.[TOTAL TAX]) AS [TransactionTotalWithoutVAT],
SUM(A.[TOTAL TAX]) AS [VATTotalAmount],
'1' AS [PaymentType],
'4' AS [Currency]
FROM
(
SELECT
T1.[storeId] AS [STORE NO]
,CONVERT(date,CONVERT(varchar(15),T1.businessDate,101)) AS [BUSINESS DATE]
,FORMAT(CONVERT(datetime,SUBSTRING(T1.startSaleTime,1,2) + ':' + SUBSTRING(T1.startSaleTime,3,2) + ':' + SUBSTRING(T1.startSaleTime,5,2), 121), 'h:mm:ss') AS [START SALE TIME]
,CASE WHEN (T1.Type) = 'TRX_Refund' OR (T1.Type) = 'TRX_Overring' THEN CAST(T1.[totalAmount] AS decimal(16,2)) * -1 ELSE CAST(T1.[totalAmount] AS decimal(16,2)) END AS [TOTAL AMOUNT]
,CASE WHEN (T1.Type) = 'TRX_Refund' OR (T1.Type) = 'TRX_Overring' THEN 0 ELSE 1 END AS [GC]
,CASE WHEN (T1.Type) = 'TRX_Refund' OR (T1.Type) = 'TRX_Overring' THEN CAST(T1.[totalTax] AS decimal(16,2)) * -1 ELSE CAST(T1.[totalTax] AS decimal(16,2)) END AS [TOTAL TAX]
,T1.NodeId AS [POS ID]
,T1.[receiptNumber] AS [RECEIPT NUMBER]
,T1.orderId AS [ORDER ID]
,
(
SELECT SUM(CASE WHEN CAST(T2.totalPrice AS float) > 0.00 THEN 1 ELSE 0 END)
FROM [McDonalds_STG].[dbo].[ITEMLEVEL] T2
WHERE T2.orderId = T1.orderId
) AS [ITEM]
FROM [McDonalds_STG].[dbo].[Orders] T1
) A
GROUP BY
A.[STORE NO],
A.[BUSINESS DATE],
A.[POS ID],
A.[RECEIPT NUMBER],
A.[START SALE TIME],
A.[ORDER ID]
)
SELECT
x.[LesseePOSNumber],
x.[InvoiceNumber],
x.[DocumentType],
x.[TransactionDateTime],
x.[TotalNumberOfItems],
x.[TransactionTotalWithoutVAT],
x.[VATTotalAmount],
x.[PaymentType],
x.[Currency],
(
SELECT
49 AS [ID],
(CAST(T1.[totalAmount] AS decimal(16,2)) - CAST(T1.[totalTax] AS decimal(16,2)) ) AS [Total]
FROM [Order] T2
WHERE T2.orderId = x.[ORDER ID]
FOR XML PATH('Category'), TYPE
) As Categories
FROM x
FOR XML PATH ('Invoice'), root ('Invoices')
여기에는 중요하고 현명한 리팩토링을위한 몇 가지 기회가 있습니다 (날짜 / 문자열 / 날짜 처리는 가능한 경우 문자열을 사용하지 않고 버리고 다시 수행해야 함). 오타 수정이 필요할 수 있습니다. 읽기 쉬운 SQL이 아니며 SSMS에 바로 붙여넣고 약간의 조정없이 작동 할 것이라고 기대하지 않습니다!
GROUP BY STORE NO이지만 사용하지 않는 것 같습니다.
jdweng Sep 17 2020 at 04:23
xml linq 시도 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
Dictionary<string, XElement> dict = doc.Descendants("Invoice")
.GroupBy(x => (string)x.Element("LesseePOSNumber"), y => y)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
string lesseePOSNumber = "1";
string id = "29";
int total = 3000;
if (dict.ContainsKey(lesseePOSNumber))
{
XElement categories = new XElement("Categories", new XElement("Category", new object[] {
new XElement("ID", id),
new XElement("Total", total)
}));
dict[lesseePOSNumber].Add(categories);
}
}
}
}