3

这个项目的范围比这个问题要大得多。我接到了一个项目的任务,我不会用私密的细节让你厌烦。最终我需要做的是将数据从数据库中取出并转换为 XML,这样我就可以转换为 JSON 并创建一个简单的 Web 应用程序,它允许我以满足客户需求的方式解析和格式化数据。

我敢肯定有更好的方法来做到这一点,但这是我已经确定的路径..

我有大约 46,000 条记录转储到临时表中。为了让您了解这些数据的结构,运行以下查询:

SELECT 
    TransactionID,
    OwnerID,  
    Date, 
    TransactionType,
    ChargeCode, 
    Description, 
    DebitAmount
FROM #OwnerHistoryTemp
WHERE OwnerID = '11111111'

返回这个:

TransactionID   OwnerID     Date        TransactionType ChargeCode  Description         DebitAmount
28727           11111111    2014-12-01  E               A1          APPLY CHARGES       210.00  
28728           11111111    2014-12-03  C               A1          DB11111111          210.00  
28729           11111111    2015-01-01  E               A1          APPLY CHARGES       183.37  

我在这里要做的是使用 SQL FOR XML PATH(对任何其他建议开放)来输出数据,如下所示:

<OwnerHistory>
    <OwnerID OwnerID="11111111">
        <Transactions>
            <TransactionID ID="28727">
                <Date>2014-12-01</Date>
                <TransactionType>E</TransactionType>
                <ChargeCode>A1</ChargeCode>
                <Description>APPLY CHARGES</Description>
                <DebitAmount>210.00</DebitAmount>
            </TransactionID>
            <TransactionID ID="28728">
                <Date>2014-12-03</Date>
                <TransactionType>C</TransactionType>
                <ChargeCode>A1</ChargeCode>
                <Description>DB11111111</Description>
                <DebitAmount>210.00</DebitAmount>
            </TransactionID>
            <TransactionID ID="28729">
                <Date>2015-1-01</Date>
                <TransactionType>E</TransactionType>
                <ChargeCode>A1</ChargeCode>
                <Description>APPLY CHARGES</Description>
                <DebitAmount>183.37</DebitAmount>
            </TransactionID>
        </Transactions>
    </OwnerID>
</OwnerHistory>

我的 Query 让我很接近,但不是 QUITE 那里。因为相同的 OwnerID 出现多次(每个 TransactionID 一次),所以运行以下查询:

SELECT 
    OwnerID AS "@OwnerID", 
    TransactionID AS "Transaction/@RecordID", 
    Date AS "Transaction/Date", 
    TransactionType AS "Transaction/TransactionType",
    ChargeCode AS "Transaction/ChargeCode", 
    Description AS "Transaction/Description", 
    DebitAmount AS "Transaction/DebitAmount"
FROM #OwnerHistoryTemp
WHERE OwnerID = '11111111'
GROUP BY OwnerID, RecordID, Date, ChargeCode, Description, DebitAmount
order by OwnerID
FOR XML PATH ('OwnerID'), ROOT('OwnerHistory')

返回以下内容:

<OwnerHistory>
    <OwnerID OwnerID="11111111">
        <Transaction RecordID="28727">
            <Date>2014-12-01</Date>
            <TransactionType>E</TransactionType>
            <ChargeCode>A1</ChargeCode>
            <Description>APPLY CHARGES</Description>
            <DebitAmount>210.0000</DebitAmount>
        </Transaction>
    </OwnerID>
    <OwnerID OwnerID="11111111">
        <Transaction RecordID="28728">
            <Date>2014-12-03</Date>
            <TransactionType>C</TransactionType>
            <ChargeCode>A1</ChargeCode>
            <Description>DB11111111</Description>
            <DebitAmount>210.0000</DebitAmount>
        </Transaction>
    </OwnerID>
    <OwnerID OwnerID="11111111">
        <Transaction RecordID="28729">
            <Date>2015-01-01</Date>
            <TransactionType>E</TransactionType>
            <ChargeCode>A1</ChargeCode>
            <Description>APPLY CHARGES</Description>
            <DebitAmount>183.3700</DebitAmount>
        </Transaction>
    </OwnerID>
</OwnerHistory>

关于如何仅将 OwnerID 作为父级一次并将所有事务分组在其下的任何想法?

可能是一些我只是不理解的简单事情,或者这可能是不可能的。如果是前者,请随意公开鞭打我......

4

1 回答 1

3

准备好接受鞭刑了吗?

嵌套查询以获得嵌套的 XML,如下所示:

SELECT TOP 1
  OwnerID AS "@ID",
  (SELECT
      TransactionID AS "Transaction/@ID",
      [Date] AS "Transaction/Date",
      TransactionType AS "Transaction/Type",
      ChargeCode AS "Transaction/ChargeCode",
      [Description] AS "Transaction/Description",
      DebitAmount AS "Transaction/DebitAmount"
    FROM OwnerHistory
    WHERE OwnerID = [Owner].OwnerID
    FOR XML PATH(''), TYPE) Transactions
FROM OwnerHistory [Owner]
WHERE OwnerID = '11111111' 
FOR XML PATH('Owner'), ROOT('OwnerHistory'), TYPE

生成的 XML:

<OwnerHistory>
  <Owner ID="11111111">
    <Transactions>
      <Transaction ID="28727">
        <Date>2015-03-26</Date>
        <Type>E</Type>
        <ChargeCode>A1</ChargeCode>
        <Description>APPLY CHARGES</Description>
        <DebitAmount>210.0000</DebitAmount>
      </Transaction>
      <Transaction ID="28728">
        <Date>2015-03-26</Date>
        <Type>C</Type>
        <ChargeCode>A1</ChargeCode>
        <Description>DB11111111</Description>
        <DebitAmount>210.0000</DebitAmount>
      </Transaction>
      <Transaction ID="28729">
        <Date>2015-03-26</Date>
        <Type>E</Type>
        <ChargeCode>A1</ChargeCode>
        <Description>APPLY CHARGES</Description>
        <DebitAmount>183.3700</DebitAmount>
      </Transaction>
    </Transactions>
  </Owner>
</OwnerHistory>

请注意,TOP 1仅包含 是为了避免对包含 的每一行重复整个事务集OwnerID。这可以通过多种方式处理;通常这种嵌套将是两个规范化表连接的结果,因此只会Owner出现一个实例。

MSDN 有一些很好的例子来演示这种技术。

于 2015-03-26T06:36:50.107 回答