c# - XML 列输出

标签 c# sql sql-server xml vb.net

我正在开发一个控制台程序,以使用 SQL Server 数据库和 .NET 生成 XML 文件。

目前,我一直在使用我的代码来生成正确的 XML 文件。当我在记事本中打开文件时,我的 Categories 节点没有被正确识别为 XML 格式,因此我无法很好地使用它。

需要的是:

  1. 如下所示为 类别 生成正确的 XML 标记,并且在任何记事本中打开时不应包含任何特殊字符。

  2. 如果我有多个站点 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))
    

最佳答案

我想应该是这样的:

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 但您似乎没有使用它

关于c# - XML 列输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63926636/

相关文章:

C#/WPF : Display Images like a LightBox in jQuery?

c# - 如何以编程方式从数据库生成 Entity Framework 类?

c# - 我可以在模拟中处理不区分大小写的字符串吗?

SQL 和在多个表上存储外键与通过表连接进行查询

sql - 如何使用游标更新记录

返回更新记录的 SQL Server 存储过程

c# - 托管 Windows 窗体设计器 - 在运行时序列化设计器并生成 C# 代码

mysql - 如何选择不同记录列的总和值?

mysql - 如何用 JOIN 重写这个语句,使其更快?

sql-server - 粒度为 "Block incremental deployment if data loss might occur"