1

我有一个不能修改的存储过程,这个存储过程的结果是正常的选择语句如下:

CREATE PROCEDURE LockedProcedure
AS
BEGIN
    SELECT * FROM COLORS_TABLE
END

我的问题是我需要将其结果作为 XML 结果获取,例如当您提供“FOR XML”但不修改过程本身时 select 语句如何返回,也许我们可以创建另一个存储过程来调用该或用户定义的函数。

这是一个我们不能修改的过程示例,因为它已被锁定。

如何将其结果作为 XML 结果而不是 XML 文件...我不想要硬盘上的任何物理文件。

谢谢。

4

2 回答 2

0

解决方案1)

  1. 创建一个与存储过程的输出定义匹配的临时表。
  2. 用于INSERT INTO #Tmp EXEC SPName将存储过程结果插入到临时表中。
  3. FOR XML与命令结合使用以SELECT从临时表中以 xml 格式获取结果。

解决方案2)

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

于 2012-09-14T15:25:38.570 回答
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
于 2016-03-04T16:16:11.577 回答