2012-09-14 69 views
1

我有一個存儲過程,不能修改,這個存儲過程的結果是正常的select語句如下:如何將存儲過程的結果轉換爲sql服務器上的xml?

CREATE PROCEDURE LockedProcedure 
AS 
BEGIN 
    SELECT * FROM COLORS_TABLE 
END 

我的問題是,我需要爲XML結果怎麼樣選擇獲取它的結果語句在您提供「FOR XML」時返回,但不修改過程本身,也許我們可以創建另一個存儲過程來調用該函數或用戶定義的函數。

這是我們無法修改的過程示例,因爲它被鎖定。

如何得到其結果爲XML結果不是XML文件...我不想在硬盤上有任何物理文件。

謝謝。

回答

0

溶液1)

  1. 創建臨時表的存儲過程的輸出定義相匹配。
  2. 使用INSERT INTO #Tmp EXEC SPName將存儲過程結果插入到臨時表中。
  3. 使用FOR XML結合SELECT命令將結果作爲xml從臨時表中獲取。

方案二)

創建一個CLR用戶定義函數來執行存儲過程,並使用BCL設施的結果轉換爲XML。

+0

我有不止一個過程和存儲過程的定義不是靜態的,所以我不能確保我可以按照臨時表解決方案,因爲每次我調用過程時,它給了我不同的定義...我也不能使用CLR – user1512094

0

我有一個類似的問題,但在我的情況下編輯存儲過程是可能的。儘管OP提到存儲過程被鎖定,但我仍然希望在這裏發佈這個解決方案,讓其他人發現它。此解決方案假定存儲過程使用動態SQL來選擇一些數據,但可以很容易地適應非動態SQL情況。

  1. 向sp添加參數,例如「@lp_ReturnAsXML BIT = 0」。設置爲true時,將使用「FOR XML RAW」或類似命令將結果集作爲XML返回。
  2. 那麼這個存儲過程的結束作爲替代增加對運行動態SQL:

    IF @lp_ReturnAsXML = 1 
    BEGIN 
        DECLARE @l_XML XML 
        SET @l_SQL = 'SET @l_XML = (SELECT * FROM (' + 
         @l_SQL + ' 
         ) d FOR XML RAW)' 
        EXEC sp_executesql @l_SQL, N'@l_XML XML OUTPUT', @l_XML = @l_XML OUTPUT 
        SELECT @l_XML 
    END 
    

現在這樣的事情應該工作:

DECLARE @table TABLE 
(
    Results XML 
) 

INSERT INTO @table 
EXEC p_MyStoredProc ..., @lp_ReturnAsXML = 1 
相關問題