如何将存储过程返回的XML放入变量中?

时间:2010-06-18 13:11:40

标签: sql-server xml stored-procedures variables

我有存储过程返回XML。 XML不作为参数返回,而是作为SELECT的结果:

create procedure #xml_test
as
  select 1 as a for xml raw
go

我正在尝试将此XML放在变量中:

declare @xml as nvarchar(max)

但我找不到怎么做。我最好的想法是INSERT INTO ... EXEC,但是我收到错误'INSERT语句中不允许使用FOR XML子句。':

create table #tmp(col1 nvarchar(max) not null)

insert into #tmp
exec #xml_test

这种方法适用于通常的文本:

create procedure #text_test
as
  select 'aaa' as a 
go

insert into #tmp
exec #text_test

我想知道以前是否有人遇到过这个问题?我在SQL Server 2005上

3 个答案:

答案 0 :(得分:3)

在此页面上有很多从XML到变量的选择示例:

Microsoft SQL Server 2005中FOR XML的新功能 http://msdn.microsoft.com/en-us/library/ms345137%28SQL.90%29.aspx

给出的最简单的例子是:

DECLARE @cust XML;
SET @cust = (SELECT * FROM Customers FOR XML AUTO, TYPE)

好的,在经过适当的劝告之后,这是一个愚蠢的,经过深思熟虑的评论,这是一个答案,我希望它会好一些。它使用OPENROWSET将存储过程的结果存储到临时表中。从那里,结果可以传递给变量。它有点乱,需要ALTER SETTINGS服务器级权限才能启用Ad Hoc Distributed Queries。

无论如何,这是经过全面测试的T-SQL:

CREATE DATABASE db_test;
GO

USE [db_test];
GO

CREATE PROCEDURE xml_test
AS
    SELECT 1 AS a FOR XML RAW
GO

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO

sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

SELECT * INTO #tbl_test FROM
    OPENROWSET(
        'SQLNCLI',
        'Server=(local);trusted_connection=yes',
        'set fmtonly off exec db_test.dbo.xml_test') AS tbl_test;
GO

DECLARE @xml_test AS XML;
SET @xml_test = (SELECT * FROM #tbl_test FOR XML RAW, BINARY BASE64);
GO

答案 1 :(得分:0)

您可以将SELECT包装起来,以便设置一个局部变量,然后在存储过程结束时选择SELECT:

CREATE PROCEDURE xml_test
AS
BEGIN
    DECLARE @xml

    SET @xml = (SELECT 1 AS a FOR XML RAW)

    SELECT @xml AS my_xml
END

虽然有一些使用FOR XML的问题,所以如果您有子查询,联合等,那么您可能需要稍微重新编写查询。

答案 2 :(得分:0)

这个问题让我忙了一段时间。

我有一个函数,它使用两个输入xml变量的diff生成一个xml变量。

这就是我能够返回结果的方式。


CREATE FUNCTION [dbo].[GetXmlDiff]
(
    @id uniqueidentifier,
    @left XML,
    @right XML
)
RETURNS XML
AS
BEGIN
    DECLARE @Delta TABLE
    (
        id uniqueidentifier,
        Delta NVARCHAR( 10 ),
        Attribute NVARCHAR( MAX ),
        Value NVARCHAR( MAX )
    );
        ---
    --- DO THE DIFFING INTO  table VARIABLE
        ---
    DECLARE @ResultVar XML = (
    SELECT * FROM  ( 
                        SELECT  1 AS tag, 
                                null as parent, 
                                id   AS 'o!1!id',
                                null AS 'a!2!delta',
                                null AS 'a!2!name',
                                null AS 'a!2!!element'
                                 FROM @Delta 
                        UNION
                        SELECT  2 as tag, 
                                1 as parent, 
                                id,
                                Delta,
                                Attribute,
                                Value
                                 FROM @Delta 
                    ) Q 
                    FOR XML EXPLICIT );
    RETURN @ResultVar;
END

该函数现在将生成一个XML变量,其内容如下:


<o id="4CBA2CC4-1FB6-426E-8504-0000468CD7E5">
  <a delta="Add" name="attribute1">value 1</a>
  <a delta="Delete" name="attribute2"></a>
  <a delta="Update" name="attribute3">value 3</a>
 </o>