I'm not sure that my question is well written; I'm sure it's been asked before, but I have failed to find it...
In a proc, I am creating and running some dynamic SQL using EXEC to create a large CSV string. The problem is that if I put the results in to a nvarchar(max) variable in the EXEC, it's not in the PROC scope, so how do I get the value to return it via an OUTPUT variable of my procedure?
I'm guessing that I am somehow going about this whole thing in the wrong way :o)
Here is my actual code (though I could produce a less convoluted example if required and offer an explanation of why it's convoluted):
CREATE PROCEDURE GETFORMDATACSV
(
-- Add the parameters for the function here
@FORMID numeric(38,0),
@STARTDATE nvarchar(20) = '1900-01-01',
@ENDDATE nvarchar(20) = '2100-01-01'--,
--@RCSV nvarchar(max) OUTPUT
)
AS
BEGIN
DECLARE @CSV nvarchar(max);
DECLARE @CRLF nchar(2) = char(13) + char(10);
DECLARE @FIELDS nvarchar(4000); -- list of fields comma delimited
DECLARE @FIELDSDL nvarchar(4000); -- list of fields "", delimited
DECLARE @FIELDSSEL nvarchar(4000); -- list of fields with replace " with ' if needed
DECLARE @SEP nchar(1);
DECLARE @SELSEP nvarchar(20);
DECLARE @SQL nvarchar(2000);
DECLARE @FCSV nvarchar(max);
set @SEP = '';
set @SELSEP = ',''","'',';
select @FIELDS = isnull(@FIELDS,'') + @SEP + isnull(FD,'''x'''),
@FIELDSDL = isnull(@FIELDSDL,'') + @SEP + '"' + isnull(FD,'''x''') + '"',
@FIELDSSEL = isnull(@FIELDSSEL,'') + @SELSEP + 'replace(' + isnull(FD,'''x''') + ',''"'','''''''')',
@SEP = ','
from (select distinct rf.FIELD as FD from FORMRESPONSEFIELDS rf
JOIN FORMRESPONSE r on r.ID = rf.ID
where r.FORMID = @FORMID and r.RDATE between cast(@STARTDATE as date) and cast(@ENDDATE as date)) x;
if len(@FIELDS) > 0
BEGIN
set @CSV = '"RESPID","RDATE",' + @FIELDSDL ;
set @SQL = 'DECLARE @FCSV nvarchar(max); set @FCSV = ''' + @CSV + @CRLF + '''; select @FCSV = isnull(@FCSV,'''') + concat(''"'',RESPID,''","'', RDATE' + @FIELDSSEL + ',''"'',char(13),char(10)) from (select ID as RESPID, RDATE, ' + isnull(@FIELDS,'')
set @SQL = @SQL + ' from (select a.ID, FIELD, VALUE, RDATE from FORMRESPONSEFIELDS a JOIN FORMRESPONSE b on a.ID = b.ID '
set @SQL = @SQL + ' where b.FORMID = ' + cast(@FORMID as nvarchar(15)) + ' and b.RDATE between cast(''' + @STARTDATE + '''as nvarchar(20)) and cast(''' + @ENDDATE + ''' as nvarchar(20))) rf ';
set @SQL = @SQL + ' pivot ( max(VALUE) for FIELD in (' + isnull(@FIELDS,'') + ')) as pvt)x order by RDATE desc; select @FCSV; ';
END;
ELSE
BEGIN
set @SQL = 'select ''No Data available for FORMID = ' + cast(@FORMID as nvarchar(15)) + ' between ' + @STARTDATE + ' and ' + @ENDDATE + ' ''';
END;
EXEC(@SQL);
RETURN;
END;
sp_executesqlto be able to use OUTPUT pramas with dynamic sql.