2016-08-03 64 views
0

我有一個存儲過程,它使用某個表中包含的信息創建XML,並將其作爲varchar返回。 xml變量在sql代碼的開頭聲明,並在最後以SELECT語句返回。現在從SQL Server 2008中的存儲過程中獲取XML

,如果我嘗試以這種方式

DECLARE @v_XML VARCHAR(MAX) 
exec @v_XML = dbo.proc_myStoredProcedure '1234' 
select @v_XML as ResultMyStoredProcedure 

我看到了XML,因爲我想印因爲SELECT語句的屏幕上執行存儲過程,但變量@v_XML爲0

任何人都可以幫我解決這個問題嗎?

+0

如果存儲過程返回'XML' - 爲什麼你的'@ v_XML'定義爲'VARCHAR(最大值)'? –

+0

我不知道你的存儲過程在做什麼,但是 - 在大多數情況下! - SP以錯誤的方式使用......這指向一個返回XML的標量函數......您將使您的生活更輕鬆...... – Shnugo

+0

這個問題解決了嗎?你需要進一步的幫助嗎?請允許我提一個提示:在最佳答案的投票櫃檯下面勾選驗收檢查將是非常好的方法。這將1)標記這個問題已解決2)使追隨者更容易找到最佳的解決方案3)支付點給回答者和4)支付點給你。一旦你自己超過了15分的邊界,你又被要求對貢獻進行投票。這是SO的方式來說聲謝謝。快樂編碼! – Shnugo

回答

0

主要問題是:存儲過程只返回一個Int值作爲其返回值 - 通常表示操作成功/失敗,或報告受插入,刪除,更新影響的行數聲明。

不能直接返回字符串或XML

您需要在存儲過程,或者使用輸出參數,或者你需要在過程結束時做了SELECT - 但結果集是不能作爲返回代碼,你需要抓住它像這樣:

-- define the return code 
DECLARE @RC INT 

-- define the table variable to hold the result set 
DECLARE @YourOutput TABLE (XmlData XML) 

-- you need to take the result set from the stored procedure 
-- and store it into a table variable (or a "real" table, if you wish) 
INSERT INTO @YourOutput(XmlData) 
    EXECUTE @RC = dbo.proc_myStoredProcedure '1234' 

-- return code will be most likely 0 
SELECT @RC 

-- this table variable now contains your result set output from the stored procedure 
SELECT * FROM @YourOutput 
0

正如在我非常確定的評論中指出的那樣,您應該使用標量函數而不是存儲過程。勾選這個來理解的原則:

CREATE TABLE Dummy(ID INT IDENTITY,SomeValue VARCHAR(100)); 
INSERT INTO Dummy(SomeValue) VALUES('Test1'),('Test2'); 
GO 

CREATE FUNCTION dbo.MyXMLFunction(@prm VARCHAR(100)) 
RETURNS XML 
AS 
BEGIN 
RETURN 
(
    SELECT @prm AS [@InsertedPrm] 
      ,* 
    FROM Dummy 
    FOR XML PATH('Dummy'),ROOT('root') 
); 
END 
GO 

SELECT dbo.MyXMLFunction('1234'); 
GO 

DROP FUNCTION dbo.MyXMLFunction; 
DROP TABLE Dummy; 

結果

<root> 
    <Dummy InsertedPrm="1234"> 
    <ID>1</ID> 
    <SomeValue>Test1</SomeValue> 
    </Dummy> 
    <Dummy InsertedPrm="1234"> 
    <ID>2</ID> 
    <SomeValue>Test2</SomeValue> 
    </Dummy> 
</root> 
相關問題