2016-08-03 99 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> 
相关问题