2013-07-16 21 views
0

我需要使用遊標從sql腳本生成XML。基本上我需要<Table><tr><td></td></tr></Table>!我不確定如何開始,因爲遊標主題聽起來讓我感到困惑。從腳本生成XML的SQL Server遊標

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 
+1

這是**不** ** XML ......您的** XML **應該是什麼樣的?另外:你正在使用哪個版本的SQL Server? 2000? 2005年? 2008年? 2012? –

+0

我使用2008年,是的,先生,我知道這不是XML,但我只是想告訴你輸出。我希望這是使用遊標在XML中。 –

+3

爲什麼你會覺得你需要遊標?這幾乎從未如此。 –

回答

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 

Simplified DEMO

編輯:

如果你想每行作爲一個單獨的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 DEMO

+0

嗨Nenad,在上面的代碼中有一個小錯誤,它不會將結果顯示爲表格,它就像是一行中彼此相鄰的所有內容。 –

+0

@MMMSSS嗯,它是一個XML :)當格式化(點擊SSMS)它打開爲一個大的XMl。如果你真的需要像表格一樣的結果 - 請檢查編輯後的答案。 –

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> 

relevant MSDN SQL Server Books Online documentation的更多詳細信息FOR XML PATH以及如何使用它 - 這是非常靈活的,高度可定製的 - 你可以做任何事情與FOR XML PATH

那麼你的問題到底是什麼?