0

我需要使用游标从 sql 脚本生成 XML。基本上我需要<Table><tr><td></td></tr></Table>!我不知道如何开始,因为光标主题听起来让我很困惑。

DECLARE 

 @CustomerID int = 8,
 @UtilityCompanyID int = 1

SELECT MD.SERV_ACCT, 
       AD.ACCOUNT,
       AD.SERV_ADDRESS, 
       MAXINVDATE,
       AD.SERV_ACCT + ', ' + AD.ACCOUNT + ', ' + AD.SERV_ADDRESS AS ADB
FROM
(SELECT DISTINCT SERV_ACCT, MAX(INV_DATE) as MAXINVDATE
FROM tblAPSData

WHERE SERV_ACCT NOT IN (SELECT ServiceAccount
            FROM tblMEP_Meters
            JOIN tblMEP_Sites
            ON tblMEP_Meters.SiteID = tblMEP_Sites.ID

            JOIN tblMEP_Projects
            ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID

            WHERE CustomerID = 8
            AND Type = 1
            )

AND ACCOUNT IN (SELECT AccountNumber
                FROM tblMEP_CustomerAccounts
                WHERE CustomerID = @CustomerID
                AND UtilityCompanyID = @UtilityCompanyID)

AND INV_DATE > DATEADD(month, -6, getdate())
GROUP BY SERV_ACCT) MD
join tblAPSdata AD 
on MD.SERV_ACCT = AD.SERV_ACCT 
and MD.MAXINVDATE = AD.INV_DATE

我希望 XML 中的结果是这样的

SERV_ACCT   ACCOUNT         SERV_ADDRESS     ADB
0289S61288  117512280   4324E MONT          0289S61288, 117512280, 4324E MONT 
1435S01282  117512280   432E SE             1435S01282, 117512280, 432E SE  
2498S21288  117512280   reN 64 ST           2498S21288, 117512280, reN 64 ST                
5538S21284  117512280   reE DOV             5538S21284, 117512280, reE DOV 
4

2 回答 2

2

假设您有一个ServerAcct包含您正在显示的数据的表,我建议使用FOR XML PATH绝对不是游标!)来生成 XML 输出。

像这样的查询:

SELECT *
FROM dbo.ServerAcct
FOR XML PATH('ServerAccount'),ROOT('AllAccounts')

将产生此输出:

<AllAccounts>
  <ServerAccount>
    <Serv_Acct>0289S61288</Serv_Acct>
    <Account>117512280</Account>
    <Serv_Address>4324E MONT</Serv_Address>
    <ADB>0289S61288, 117512280, 4324E MONT</ADB>
  </ServerAccount>
  <ServerAccount>
    <Serv_Acct>1435S01282</Serv_Acct>
    <Account>117512280</Account>
    <Serv_Address>432E SE</Serv_Address>
    <ADB>1435S01282, 117512280, 432E SE</ADB>
  </ServerAccount>
  <ServerAccount>
    <Serv_Acct>2498S21288</Serv_Acct>
    <Account>117512280</Account>
    <Serv_Address>reN 64 ST </Serv_Address>
    <ADB>2498S21288, 117512280, reN 64 ST</ADB>
  </ServerAccount>
  <ServerAccount>
    <Serv_Acct>5538S21284</Serv_Acct>
    <Account>117512280</Account>
    <Serv_Address>reE DOV</Serv_Address>
    <ADB>5538S21284, 117512280, reE DOV</ADB>
  </ServerAccount>
</AllAccounts>

有关更多详细信息以及如何使用它,请参阅相关的 MSDN SQL Server 联机丛书文档FOR XML PATH- 它非常灵活且高度可定制 - 您几乎可以使用FOR XML PATH!

那么你的问题到底是什么?

于 2013-07-16T15:35:39.557 回答
0

您不需要游标来创建 XML,有一个FOR XML将查询结果转换为 XML 的命令,试试吧。有很多不同的选项,我相信您可以获得所需的 XML。

这是最简单的示例,其中FOR XML AUTO

DECLARE 
 @CustomerID int = 8,
 @UtilityCompanyID int = 1

WITH YourQuery AS 
(
    SELECT MD.SERV_ACCT, 
           AD.ACCOUNT,
           AD.SERV_ADDRESS, 
           MAXINVDATE,
           AD.SERV_ACCT + ', ' + AD.ACCOUNT + ', ' + AD.SERV_ADDRESS AS ADB
    FROM
        (SELECT DISTINCT SERV_ACCT, MAX(INV_DATE) as MAXINVDATE
          FROM tblAPSData

    WHERE SERV_ACCT NOT IN (SELECT ServiceAccount
            FROM tblMEP_Meters
            JOIN tblMEP_Sites
            ON tblMEP_Meters.SiteID = tblMEP_Sites.ID

            JOIN tblMEP_Projects
            ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID

            WHERE CustomerID = 8
            AND Type = 1
            )

    AND ACCOUNT IN (SELECT AccountNumber
                FROM tblMEP_CustomerAccounts
                WHERE CustomerID = @CustomerID
                AND UtilityCompanyID = @UtilityCompanyID)

    AND INV_DATE > DATEADD(month, -6, getdate())
    GROUP BY SERV_ACCT) MD
    join tblAPSdata AD 
    on MD.SERV_ACCT = AD.SERV_ACCT 
    and MD.MAXINVDATE = AD.INV_DATE
)
SELECT * FROM YourQuery FOR XML AUTO, ELEMENTS

简化演示

编辑:

如果您希望每一行作为单独的 XML,可以这样做(我不会重复上面的整个查询,只是最后一部分):

WITH YourQuery AS 
(
  ....
)
SELECT  
(
  SELECT 
        qXml.*
    FROM YourQuery qXml
    WHERE qXml.SERV_ACCT = q.SERV_ACCT --asuming this is your PK
    FOR XML PATH ('')
)
from YourQuery q

SQLFiddle 演示

于 2013-07-16T15:34:58.520 回答