I have stored procedure returning XML. XML returned not as parameter but as result of SELECT:
create procedure #xml_test
as
select 1 as a for xml raw
go
I'm trying to put this XML in a variable:
declare @xml as nvarchar(max)
But I can't find how to do it. My best idea was INSERT INTO ... EXEC, but I get error 'The FOR XML clause is not allowed in a INSERT statement.':
create table #tmp(col1 nvarchar(max) not null)
insert into #tmp
exec #xml_test
This approach works well for usual text:
create procedure #text_test
as
select 'aaa' as a
go
insert into #tmp
exec #text_test
I wonder if somebody bumped into this issue before? I'm on SQL Server 2005
A couple random ideas (just off the cuff here): 1) Duplicate the stored procedure and add the FOR XML to the return statement(not pretty but works). 2) Have a second stored procedure call the non-XML version and just return the results using FOR XML . 3) Build the XML in the SELECT statement of the stored procedure.
You can use the return statement inside a stored procedure to return an integer status code (and only of integer type). By convention a return value of zero is used for success. If no return is explicitly set, then the stored procedure returns zero. You should use the return value for status codes only.
A stored procedure does not have a return value but can optionally take input, output, or input-output parameters. A stored procedure can return output through any output or input-output parameter.
There are quite a few examples of SELECTing from XML into variables on this page:
What's New in FOR XML in Microsoft SQL Server 2005 http://msdn.microsoft.com/en-us/library/ms345137%28SQL.90%29.aspx
The simplest example given is:
DECLARE @cust XML;
SET @cust = (SELECT * FROM Customers FOR XML AUTO, TYPE)
Okay, after suitable admonishment for a silly, ill thought-out comment, here is an answer which I hope is somewhat better. It uses the OPENROWSET to store the results of a stored procedure into a temporary table. From there, the results can be passed to a variable. It's a bit messy, and requires ALTER SETTINGS server-level permission to enable Ad Hoc Distributed Queries.
Anyway, here's the fully tested 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With