如何在sql server上将存储过程的结果转换为xml?

时间:2012-09-14 15:10:11

标签: sql-server xml stored-procedures

我有一个无法修改的存储过程,这个存储过程的结果是正常的select语句如下:

CREATE PROCEDURE LockedProcedure
AS
BEGIN
    SELECT * FROM COLORS_TABLE
END

我的问题是我需要将结果作为XML结果获取,就像select语句在提供“FOR XML”时返回但没有修改过程本身一样,也许我们可以创建另一个存储过程来调用它或用户定义的函数。

这是我们无法修改的程序示例,因为它已被锁定。

如何将结果作为XML结果而不是XML文件...我不希望硬盘上有任何物理文件。

感谢。

2 个答案:

答案 0 :(得分:0)

解决方案1)

  1. 创建与存储过程的输出定义匹配的临时表。
  2. 使用INSERT INTO #Tmp EXEC SPName将存储过程结果插入临时表。
  3. FOR XMLSELECT命令结合使用,从临时表中以xml的形式获取结果。
  4. 解决方案2)

    创建一个CLR用户定义函数来执行存储过程并使用BCL工具将结果转换为xml。

答案 1 :(得分: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
    
  3. 现在这样的事情应该有效:

    DECLARE @table TABLE
    (
        Results XML
    )
    
    INSERT INTO @table
    EXEC p_MyStoredProc ..., @lp_ReturnAsXML = 1