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

Als*_*sin 6 xml sql-server variables stored-procedures

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

create procedure #xml_test
as
  select 1 as a for xml raw
go
Run Code Online (Sandbox Code Playgroud)

我试图将这个XML放在一个变量中:

declare @xml as nvarchar(max)
Run Code Online (Sandbox Code Playgroud)

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

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

insert into #tmp
exec #xml_test
Run Code Online (Sandbox Code Playgroud)

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

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

insert into #tmp
exec #text_test
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ike 3

此页面上有很多从 XML SELECTing 到变量中的示例:

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)
Run Code Online (Sandbox Code Playgroud)

好吧,在对一个愚蠢的、考虑不周的评论进行适当的警告之后,这是一个我希望更好的答案。它使用 OPENROWSET 将存储过程的结果存储到临时表中。从那里,结果可以传递给变量。这有点混乱,并且需要 ALTER SETTINGS 服务器级权限才能启用临时分布式查询。

无论如何,这是经过全面测试的 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
Run Code Online (Sandbox Code Playgroud)