<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Question Re: Post Processing Result Set with Dynamic Query Input in Technology Q&amp;A</title>
    <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819065#M4849908</link>
    <description>&lt;P&gt;You did ask for simple, right? ...just so I have that right &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;
&lt;PRE&gt;CREATE TABLE person (
   first_name    VARCHAR ( 100 ),
   member_since  DATE,
   last_seen     DATE );

INSERT person VALUES ( 'Glenn',  '2009-11-10', '2012-02-01' );
INSERT person VALUES ( 'Breck',  '2009-11-08', '2012-01-31' );
INSERT person VALUES ( 'Volker', '2009-11-11', '2012-01-30' );
COMMIT;

CREATE FUNCTION query_to_dataformat (
   IN @select LONG VARCHAR )
   RETURNS  LONG VARCHAR 
BEGIN
   DECLARE @unload LONG VARCHAR;
   DECLARE @result LONG VARCHAR;
   SET @unload = STRING (
      'UNLOAD ',
      @select,
      ' INTO VARIABLE @result ',
      ' DELIMITED BY ''^'' ',
      ' ROW DELIMITED BY ''],['' ',
      ' ESCAPES OFF HEXADECIMAL OFF QUOTES OFF' );
   EXECUTE IMMEDIATE @unload;
   RETURN STRING ( '[', LEFT ( @result, LENGTH ( @result ) - 2 ) );    
END;

SELECT query_to_dataformat ( 'SELECT first_name, member_since, last_seen FROM Person' );

query_to_dataformat('SELECT first_name, member_since, last_seen FROM Person')
[Glenn^2009-11-10^2012-02-01],[Breck^2009-11-08^2012-01-31],[Volker^2009-11-11^2012-01-30]
&lt;/PRE&gt;</description>
    <pubDate>Fri, 03 Feb 2012 15:08:45 GMT</pubDate>
    <dc:creator>Breck_Carter</dc:creator>
    <dc:date>2012-02-03T15:08:45Z</dc:date>
    <item>
      <title>Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaq-p/13819063</link>
      <description>&lt;P&gt;I have a requirement to format the results of any SELECT statement so all columns and all rows are returned as a single field. Due to how this is integrating with vendor software, I cannot pre or post-process the query outside of this function.&lt;/P&gt;
&lt;P&gt;As an example, say we have a query like this:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="k"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="n"&gt;first_name&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="n"&gt;member_since&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="n"&gt;last_seen&lt;/SPAN&gt; &lt;SPAN class="k"&gt;FROM&lt;/SPAN&gt; &lt;SPAN class="n"&gt;Person&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;The result set would normally look something like this:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="o"&gt;===============================================&lt;/SPAN&gt;
&lt;SPAN class="o"&gt;|&lt;/SPAN&gt; &lt;SPAN class="n"&gt;first_name&lt;/SPAN&gt;  &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;  &lt;SPAN class="n"&gt;member_since&lt;/SPAN&gt;  &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;  &lt;SPAN class="n"&gt;last_seen&lt;/SPAN&gt;   &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;
&lt;SPAN class="o"&gt;===============================================&lt;/SPAN&gt;
&lt;SPAN class="o"&gt;|&lt;/SPAN&gt;  &lt;SPAN class="n"&gt;Glenn&lt;/SPAN&gt;      &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;   &lt;SPAN class="mi"&gt;2009&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;11&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;10&lt;/SPAN&gt;   &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;   &lt;SPAN class="mi"&gt;2012&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mo"&gt;02&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mo"&gt;01&lt;/SPAN&gt; &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;
&lt;SPAN class="o"&gt;|&lt;/SPAN&gt;  &lt;SPAN class="n"&gt;Breck&lt;/SPAN&gt;      &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;   &lt;SPAN class="mi"&gt;2009&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;11&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;08&lt;/SPAN&gt;   &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;   &lt;SPAN class="mi"&gt;2012&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mo"&gt;01&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;31&lt;/SPAN&gt; &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;
&lt;SPAN class="o"&gt;|&lt;/SPAN&gt;  &lt;SPAN class="n"&gt;Volker&lt;/SPAN&gt;     &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;   &lt;SPAN class="mi"&gt;2009&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;11&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;11&lt;/SPAN&gt;   &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;   &lt;SPAN class="mi"&gt;2012&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mo"&gt;01&lt;/SPAN&gt;&lt;SPAN class="o"&gt;-&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;30&lt;/SPAN&gt; &lt;SPAN class="o"&gt;|&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;The data format standard dictates each row should be enclosed in square brackets and separated by commas. Each column should be separated by a '^' character. Therefore, if I call my function like this:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="n"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="n"&gt;query_to_dataformat&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'SELECT first_name, member_since, last_seen FROM Person'&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;The result should be:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="s"&gt;'[Glenn^2009-11-10^2012-02-01],[Breck^2009-11-08^2012-01-31],[Volker^2009-11-11^2012-01-30]'&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;This same thing needs to work, regardless of the original query's complexity, number of columns, or column names. My initial thought on this task was to use two techniques:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Run the query directly and loop over the results using "FOR ... USING input_sql". This way, cursor variables are created automatically, regardless of how many there are and what they are named. There is no need to use DECLARE or FETCH, which I wouldn't know beforehand anyways.&lt;/LI&gt;
&lt;LI&gt;Use a cursor that iterates over "... sa_describe_query( input_sql )" so I am able to figure out how many columns are in the row and what their names are.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Unfortunately, I am in a position where I have a variable holding a variable name and no direct way to reference the actual value. Here is my existing code (Note: this will produce extra commas and carets, but I removed the additional code that deals with those issues to make it more brief):&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="k"&gt;ALTER&lt;/SPAN&gt; &lt;SPAN class="k"&gt;FUNCTION&lt;/SPAN&gt; &lt;SPAN class="ss"&gt;"DBA"&lt;/SPAN&gt;&lt;SPAN class="p"&gt;.&lt;/SPAN&gt;&lt;SPAN class="ss"&gt;"query_to_dataformat"&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="k"&gt;IN&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt; &lt;SPAN class="n"&gt;LONG&lt;/SPAN&gt; &lt;SPAN class="nb"&gt;VARCHAR&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="k"&gt;RETURNS&lt;/SPAN&gt; &lt;SPAN class="n"&gt;LONG&lt;/SPAN&gt; &lt;SPAN class="nb"&gt;VARCHAR&lt;/SPAN&gt;
&lt;SPAN class="k"&gt;BEGIN&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;DECLARE&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;dataformat_string&lt;/SPAN&gt; &lt;SPAN class="n"&gt;LONG&lt;/SPAN&gt; &lt;SPAN class="nb"&gt;VARCHAR&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;DECLARE&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;column_number&lt;/SPAN&gt;     &lt;SPAN class="nb"&gt;INTEGER&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;DECLARE&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="k"&gt;column_name&lt;/SPAN&gt;       &lt;SPAN class="nb"&gt;VARCHAR&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;128&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;DECLARE&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;column_list&lt;/SPAN&gt; &lt;SPAN class="k"&gt;DYNAMIC&lt;/SPAN&gt; &lt;SPAN class="k"&gt;SCROLL&lt;/SPAN&gt; &lt;SPAN class="k"&gt;CURSOR&lt;/SPAN&gt; &lt;SPAN class="k"&gt;FOR&lt;/SPAN&gt;
        &lt;SPAN class="k"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="n"&gt;column_number&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="n"&gt;name&lt;/SPAN&gt; &lt;SPAN class="k"&gt;FROM&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sa_describe_query&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;

    &lt;SPAN class="c1"&gt;-- Execute input SQL and loop over results&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;FOR&lt;/SPAN&gt; &lt;SPAN class="n"&gt;results_loop&lt;/SPAN&gt; &lt;SPAN class="k"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="n"&gt;results&lt;/SPAN&gt; &lt;SPAN class="k"&gt;CURSOR&lt;/SPAN&gt; &lt;SPAN class="k"&gt;USING&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;DO&lt;/SPAN&gt;
        &lt;SPAN class="c1"&gt;-- Every row begins with a '[' character&lt;/SPAN&gt;
        &lt;SPAN class="k"&gt;SET&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;dataformat_string&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="n"&gt;STRING&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;dataformat_string&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s1"&gt;'['&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;

        &lt;SPAN class="c1"&gt;-- Loop over each column in the result set&lt;/SPAN&gt;
        &lt;SPAN class="k"&gt;OPEN&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;column_list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;column_loop&lt;/SPAN&gt;&lt;SPAN class="p"&gt;:&lt;/SPAN&gt; &lt;SPAN class="n"&gt;LOOP&lt;/SPAN&gt;
            &lt;SPAN class="k"&gt;FETCH&lt;/SPAN&gt; &lt;SPAN class="k"&gt;NEXT&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;column_list&lt;/SPAN&gt; &lt;SPAN class="k"&gt;INTO&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;column_number&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="k"&gt;column_name&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

            &lt;SPAN class="c1"&gt;-- Leave loop if we processed all columns&lt;/SPAN&gt;
            &lt;SPAN class="n"&gt;IF&lt;/SPAN&gt; &lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="k"&gt;SQLCODE&lt;/SPAN&gt; &lt;SPAN class="o"&gt;&amp;lt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="mi"&gt;0&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="k"&gt;THEN&lt;/SPAN&gt; &lt;SPAN class="n"&gt;LEAVE&lt;/SPAN&gt; &lt;SPAN class="n"&gt;column_loop&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt; &lt;SPAN class="k"&gt;END&lt;/SPAN&gt; &lt;SPAN class="n"&gt;IF&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

            &lt;SPAN class="c1"&gt;-- Append column data to string; Columns are separated by '^'&lt;/SPAN&gt;
            &lt;SPAN class="k"&gt;SET&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;dataformat_string&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="n"&gt;STRING&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;dataformat_string&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s1"&gt;'^'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="k"&gt;column_name&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;

        &lt;SPAN class="k"&gt;END&lt;/SPAN&gt; &lt;SPAN class="n"&gt;LOOP&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="k"&gt;CLOSE&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;column_list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

        &lt;SPAN class="c1"&gt;-- Every row ends with a ']' character&lt;/SPAN&gt;
        &lt;SPAN class="k"&gt;SET&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;dataformat_string&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="n"&gt;STRING&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;dataformat_string&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s1"&gt;'],'&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;END&lt;/SPAN&gt; &lt;SPAN class="k"&gt;FOR&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="c1"&gt;-- Return final string required data format&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;RETURN&lt;/SPAN&gt; &lt;SPAN class="o"&gt;@&lt;/SPAN&gt;&lt;SPAN class="n"&gt;dataformat_string&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="k"&gt;END&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;In the above example, @column_name would be holding "first_name", "member_since", or "last_seen". That is the variable name I need to reference from the FOR statement, but it doesn't seem possible to resolve it to the actual local FOR variable, which is holding "Breck" or "Glenn". &lt;/P&gt;
&lt;P&gt;This results in the output string of the following:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="s"&gt;'[first_name^member_since^last_seen],[first_name^member_since^last_seen],[first_name^member_since^last_seen]'&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;Am I going about this the wrong way? Is there a simpler solution I am missing?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Environment&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;OS&lt;/STRONG&gt;: Windows Server 2008 64bit &lt;STRONG&gt;Database&lt;/STRONG&gt;: SQL Anywhere 11.0.1.2724&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CPU&lt;/STRONG&gt;: 2x Intel Xeon 10-Core &lt;STRONG&gt;RAM&lt;/STRONG&gt;: 64GB &lt;STRONG&gt;Disk&lt;/STRONG&gt;: 320GB FusionIO (database), 640GB FusionIO (log/temp)&lt;/P&gt;</description>
      <pubDate>Wed, 01 Feb 2012 16:45:04 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaq-p/13819063</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2012-02-01T16:45:04Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819064#M4849907</link>
      <description>&lt;P&gt;You are on the right track but what you need to build from the sa_describe_query output is a statement that you will then use on an EXECUTE IMMEDIATE call.&lt;/P&gt;
&lt;P&gt;example (not tested):&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="n"&gt;declare&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;declare&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@result&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;compose&lt;/SPAN&gt; &lt;SPAN class="n"&gt;list&lt;/SPAN&gt; &lt;SPAN class="n"&gt;of&lt;/SPAN&gt; &lt;SPAN class="n"&gt;columns&lt;/SPAN&gt;
&lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;generates&lt;/SPAN&gt; &lt;SPAN class="n"&gt;string&lt;/SPAN&gt; &lt;SPAN class="n"&gt;like&lt;/SPAN&gt; &lt;SPAN class="s"&gt;"c1"&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'^'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;"c2"&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'^'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="o"&gt;...&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'^'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;"cn"&lt;/SPAN&gt;
&lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;string&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'"'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="n"&gt;name&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'"'&lt;/SPAN&gt; &lt;SPAN class="p"&gt;),&lt;/SPAN&gt;
           &lt;SPAN class="s"&gt;',''^'','&lt;/SPAN&gt; &lt;SPAN class="n"&gt;order&lt;/SPAN&gt; &lt;SPAN class="n"&gt;by&lt;/SPAN&gt; &lt;SPAN class="n"&gt;column_number&lt;/SPAN&gt;
       &lt;SPAN class="p"&gt;)&lt;/SPAN&gt;
  &lt;SPAN class="n"&gt;into&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt;
  &lt;SPAN class="n"&gt;from&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sa_describe_query&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;

&lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;build&lt;/SPAN&gt; &lt;SPAN class="n"&gt;rest&lt;/SPAN&gt; &lt;SPAN class="n"&gt;of&lt;/SPAN&gt; &lt;SPAN class="n"&gt;the&lt;/SPAN&gt; &lt;SPAN class="n"&gt;statement&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;set&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'select list( string( ''['','&lt;/SPAN&gt;
          &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt;
          &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="s"&gt;','']'' ), '','' ) into @result from ( '&lt;/SPAN&gt;
          &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt;
          &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="s"&gt;') dt'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;generate&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@result&lt;/SPAN&gt; &lt;SPAN class="n"&gt;from&lt;/SPAN&gt; &lt;SPAN class="n"&gt;the&lt;/SPAN&gt; &lt;SPAN class="n"&gt;rows&lt;/SPAN&gt; &lt;SPAN class="n"&gt;selected&lt;/SPAN&gt; &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="n"&gt;the&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt;
&lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;assumption&lt;/SPAN&gt; &lt;SPAN class="n"&gt;is&lt;/SPAN&gt; &lt;SPAN class="n"&gt;that&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt; &lt;SPAN class="n"&gt;is&lt;/SPAN&gt; &lt;SPAN class="n"&gt;a&lt;/SPAN&gt; &lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;statement&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;execute&lt;/SPAN&gt; &lt;SPAN class="n"&gt;immediate&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="k"&gt;return&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@result&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;HR /&gt;
&lt;P&gt;&lt;B&gt;Update #1:&lt;/B&gt;
I spent a few minutes to write up a more general solution (which I have tested :-):&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="n"&gt;create&lt;/SPAN&gt; &lt;SPAN class="ow"&gt;or&lt;/SPAN&gt; &lt;SPAN class="n"&gt;replace&lt;/SPAN&gt; &lt;SPAN class="n"&gt;function&lt;/SPAN&gt; &lt;SPAN class="n"&gt;f_wrap_query_results&lt;/SPAN&gt; &lt;SPAN class="p"&gt;(&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@select&lt;/SPAN&gt;  &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;        &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;must&lt;/SPAN&gt; &lt;SPAN class="n"&gt;be&lt;/SPAN&gt; &lt;SPAN class="n"&gt;a&lt;/SPAN&gt; &lt;SPAN class="n"&gt;valid&lt;/SPAN&gt; &lt;SPAN class="n"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="n"&gt;query&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@orderby&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt; &lt;SPAN class="n"&gt;default&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;optional&lt;/SPAN&gt; &lt;SPAN class="n"&gt;list&lt;/SPAN&gt; &lt;SPAN class="n"&gt;of&lt;/SPAN&gt; &lt;SPAN class="n"&gt;columns&lt;/SPAN&gt; &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="n"&gt;query&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_sep&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt; &lt;SPAN class="n"&gt;default&lt;/SPAN&gt; &lt;SPAN class="s"&gt;','&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_beg&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt; &lt;SPAN class="n"&gt;default&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'"'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_end&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt; &lt;SPAN class="n"&gt;default&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'"'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@row_sep&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt; &lt;SPAN class="n"&gt;default&lt;/SPAN&gt; &lt;SPAN class="n"&gt;char&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;10&lt;/SPAN&gt;&lt;SPAN class="p"&gt;),&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@row_beg&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt; &lt;SPAN class="n"&gt;default&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'{'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;
           &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@row_end&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt; &lt;SPAN class="n"&gt;default&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'}'&lt;/SPAN&gt;
    &lt;SPAN class="p"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;returns&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;begin&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;declare&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;declare&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@result&lt;/SPAN&gt; &lt;SPAN class="n"&gt;long&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;prepare&lt;/SPAN&gt; &lt;SPAN class="n"&gt;delimiters&lt;/SPAN&gt; &lt;SPAN class="k"&gt;for&lt;/SPAN&gt; &lt;SPAN class="k"&gt;use&lt;/SPAN&gt; &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="n"&gt;generated&lt;/SPAN&gt; &lt;SPAN class="n"&gt;statement&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;if&lt;/SPAN&gt; &lt;SPAN class="n"&gt;isnull&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_sep&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="o"&gt;!=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt; &lt;SPAN class="k"&gt;then&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;set&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_sep&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;','''&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="n"&gt;replace&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_sep&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''''&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''''''&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''','&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;else&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;set&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_sep&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;','&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;end&lt;/SPAN&gt; &lt;SPAN class="k"&gt;if&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;if&lt;/SPAN&gt; &lt;SPAN class="n"&gt;isnull&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_beg&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="o"&gt;!=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt; &lt;SPAN class="k"&gt;then&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;set&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_beg&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''''&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="n"&gt;replace&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_beg&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''''&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''''''&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''','&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;end&lt;/SPAN&gt; &lt;SPAN class="k"&gt;if&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;if&lt;/SPAN&gt; &lt;SPAN class="n"&gt;isnull&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_end&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="o"&gt;!=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt; &lt;SPAN class="k"&gt;then&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;set&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_end&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;','''&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="n"&gt;replace&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_end&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''''&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''''''&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''''&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;end&lt;/SPAN&gt; &lt;SPAN class="k"&gt;if&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="k"&gt;if&lt;/SPAN&gt; &lt;SPAN class="n"&gt;isnull&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@orderby&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt; &lt;SPAN class="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="o"&gt;!=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt; &lt;SPAN class="k"&gt;then&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;set&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@orderby&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;' order by '&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@orderby&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;end&lt;/SPAN&gt; &lt;SPAN class="k"&gt;if&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;compose&lt;/SPAN&gt; &lt;SPAN class="n"&gt;list&lt;/SPAN&gt; &lt;SPAN class="n"&gt;of&lt;/SPAN&gt; &lt;SPAN class="n"&gt;columns&lt;/SPAN&gt;
    &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;generates&lt;/SPAN&gt; &lt;SPAN class="n"&gt;string&lt;/SPAN&gt; &lt;SPAN class="n"&gt;like&lt;/SPAN&gt; &lt;SPAN class="s"&gt;"c1"&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'^'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;"c2"&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'^'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="o"&gt;...&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'^'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="s"&gt;"cn"&lt;/SPAN&gt; &lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="n"&gt;where&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'^'&lt;/SPAN&gt; &lt;SPAN class="n"&gt;is&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_sep&lt;/SPAN&gt;&lt;SPAN class="p"&gt;)&lt;/SPAN&gt;
    &lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;
               &lt;SPAN class="n"&gt;string&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@col_beg&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;
                       &lt;SPAN class="s"&gt;'"'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="n"&gt;name&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'"'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;   &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;see&lt;/SPAN&gt; &lt;SPAN class="n"&gt;Encoding&lt;/SPAN&gt; &lt;SPAN class="n"&gt;note&lt;/SPAN&gt; &lt;SPAN class="n"&gt;below&lt;/SPAN&gt;
                       &lt;SPAN class="nv"&gt;@col_end&lt;/SPAN&gt; &lt;SPAN class="p"&gt;),&lt;/SPAN&gt;
               &lt;SPAN class="nv"&gt;@col_sep&lt;/SPAN&gt; &lt;SPAN class="n"&gt;order&lt;/SPAN&gt; &lt;SPAN class="n"&gt;by&lt;/SPAN&gt; &lt;SPAN class="n"&gt;column_number&lt;/SPAN&gt;
           &lt;SPAN class="p"&gt;)&lt;/SPAN&gt;
      &lt;SPAN class="n"&gt;into&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt;
      &lt;SPAN class="n"&gt;from&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sa_describe_query&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@select&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;

    &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;build&lt;/SPAN&gt; &lt;SPAN class="n"&gt;rest&lt;/SPAN&gt; &lt;SPAN class="n"&gt;of&lt;/SPAN&gt; &lt;SPAN class="n"&gt;the&lt;/SPAN&gt; &lt;SPAN class="n"&gt;statement&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;set&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'select list( string( @row_beg,'&lt;/SPAN&gt;
              &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt;
              &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="s"&gt;',@row_end ), @row_sep'&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@orderby&lt;/SPAN&gt;
          &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="s"&gt;' ) into @result from ( '&lt;/SPAN&gt;
          &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@select&lt;/SPAN&gt;
          &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="s"&gt;') dt'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;generate&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@result&lt;/SPAN&gt; &lt;SPAN class="n"&gt;from&lt;/SPAN&gt; &lt;SPAN class="n"&gt;the&lt;/SPAN&gt; &lt;SPAN class="n"&gt;rows&lt;/SPAN&gt; &lt;SPAN class="n"&gt;selected&lt;/SPAN&gt; &lt;SPAN class="n"&gt;in&lt;/SPAN&gt; &lt;SPAN class="n"&gt;the&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt;
    &lt;SPAN class="o"&gt;--&lt;/SPAN&gt; &lt;SPAN class="n"&gt;assumption&lt;/SPAN&gt; &lt;SPAN class="n"&gt;is&lt;/SPAN&gt; &lt;SPAN class="n"&gt;that&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt; &lt;SPAN class="n"&gt;is&lt;/SPAN&gt; &lt;SPAN class="n"&gt;a&lt;/SPAN&gt; &lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;statement&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;execute&lt;/SPAN&gt; &lt;SPAN class="n"&gt;immediate&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@query&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="k"&gt;return&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@result&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;end&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;Using this solution, to get your output use:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;f_wrap_query_results&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="n"&gt;input_sql&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="n"&gt;null&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'^'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;','&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'['&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;']'&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;Functions to wrap the query results as other data types can easily be built on top of this function. Examples:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;create or replace function f_wrap_query_results_as_html (
           in @select  long varchar,        -- must be a valid SELECT query
           in @orderby long varchar default '', -- optional list of columns in query
           in @row_sep long varchar default char(10)
    )
returns long varchar
begin
    return f_wrap_query_results( @select, @orderby, '', '&lt;SPAN class="nt"&gt;&amp;lt;td&amp;gt;&lt;/SPAN&gt;', '&lt;SPAN class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/SPAN&gt;', @row_sep, '&lt;SPAN class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/SPAN&gt;', '&lt;SPAN class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/SPAN&gt;' );
end;

create or replace function f_wrap_query_results_as_json (
           in @select  long varchar,        -- must be a valid SELECT query
           in @orderby long varchar default ''  -- optional list of columns in query
    )
returns long varchar
begin
    return f_wrap_query_results( @select, @orderby, ',', '''', '''', ',', '[', ']' );
end;

create or replace function f_wrap_query_results_as_csv (
           in @select  long varchar,        -- must be a valid SELECT query
           in @orderby long varchar default ''  -- optional list of columns in query
    )
returns long varchar
begin
    return f_wrap_query_results( @select, @orderby, ',', '''', '''', char(10), '', '' );
end;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;&lt;B&gt;Encoding:&lt;/B&gt;
Note that formatting (e.g. date types) and quoting / escaping of special characters in the column values is left as an exercise to the reader! &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;  Hint: you could use the domain_name of the column to decide how to change the expression string('"', name, '"') to do the appropriate encoding of the column value. For example, if encoding as HTML then the expression could be changed to string('html_encode("', name, '")').&lt;/P&gt;
&lt;HR /&gt;
&lt;P&gt;Example usage:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;f_wrap_query_results&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'select top 3 table_id, file_id, count from systable order by table_id'&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;outputs:
&lt;/P&gt;&lt;PRE&gt;{"1","0","274"}
{"2","0","2011"}
{"3","0","303"}
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;f_wrap_query_results_as_html&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'select top 3 table_id, file_id, count from systable order by table_id'&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;outputs:
&lt;/P&gt;&lt;PRE&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;274&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2011&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;303&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;f_wrap_query_results_as_json&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'select top 3 table_id, file_id, count from systable order by table_id'&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;outputs:
&lt;/P&gt;&lt;PRE&gt;['1','0','274'],['2','0','2011'],['3','0','303']
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;f_wrap_query_results_as_csv&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'select top 3 table_id, file_id, count from systable order by table_id'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'count desc'&lt;/SPAN&gt; &lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;outputs:
&lt;/P&gt;&lt;PRE&gt;'2','0','2011'
'3','0','303'
'1','0','274'
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Note that this last example uses the @orderby parameter to change the order in which the output is listed.&lt;/P&gt;
&lt;HR /&gt;
&lt;P&gt;&lt;B&gt;Update #2:&lt;/B&gt;
A warning: any time that you are using EXECUTE IMMEDIATE on a string that is generated from user input you should be careful not to open your application to SQL Injection attacks - always sanitize your inputs!&lt;/P&gt;</description>
      <pubDate>Wed, 01 Feb 2012 17:21:53 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819064#M4849907</guid>
      <dc:creator>MarkCulp</dc:creator>
      <dc:date>2012-02-01T17:21:53Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819066#M4849909</link>
      <description>&lt;P&gt;Just a hint:&lt;/P&gt;
&lt;P&gt;The &lt;A href="http://dcx.sybase.com/index.html#1201/en/dbreference/list-function.html"&gt;LIST() aggregate&lt;/A&gt; may be helpful to "flatten" the multiple columns into one string, and you could use "^" as the according delimiter...&lt;/P&gt;</description>
      <pubDate>Thu, 02 Feb 2012 10:40:03 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819066#M4849909</guid>
      <dc:creator>VolkerBarth</dc:creator>
      <dc:date>2012-02-02T10:40:03Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819067#M4849910</link>
      <description>&lt;P&gt;Looks like a valid suggestion for a new set of builin functions, right? - Developped with a kind of public version control via the edit history:)&lt;/P&gt;
&lt;P&gt;Great solution, anyway!&lt;/P&gt;</description>
      <pubDate>Fri, 03 Feb 2012 05:05:20 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819067#M4849910</guid>
      <dc:creator>VolkerBarth</dc:creator>
      <dc:date>2012-02-03T05:05:20Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819068#M4849911</link>
      <description>&lt;P&gt;Mark, brilliant solution! I really like the generalized function, too. I suspect it would be useful in a quite a few scenarios.&lt;/P&gt;
&lt;P&gt;One issue I'm having now is that sa_describe_query() truncates the "name" field to VARCHAR(128). Some queries have large string concatenations and functions without an alias. This screws up the SELECT list of columns from being built correctly, since some parenthesis (and possibly quotes) are not closed, causing them to become unbalanced and the EXECUTE IMMEDIATE call fails with syntax, or other errors. For example:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;f_wrap_query_results&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'select top 3 string(table_id, table_id, table_id, table_id, table_id, table_id, table_id, table_id, table_id, table_id, table_id, table_id ), file_id, count from systable order by table_id'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;Although the underlying issue, even if there was a way to fix that, may be the lack of an alias, in general. For example:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="nb"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;f_wrap_query_results&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt; &lt;SPAN class="s"&gt;'select top 3  table_id || table_id, table_id, file_id, count from systable order by table_id'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;Results in "Derived table 'dt' has no name for column 1"&lt;/P&gt;</description>
      <pubDate>Fri, 03 Feb 2012 13:50:07 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819068#M4849911</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2012-02-03T13:50:07Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819069#M4849912</link>
      <description>&lt;P&gt;The root issue in both of your examples is that there is a column in the derived table that does not have a name.... hence the "Derived table 'dt' has no name for column 1" error that you are getting in your second example.  Your first example has also hit a idiosyncrasy in the server's unparser - when a column is not given an explicit name the server makes up a name for it from the text of the column expression and in this case it has chosen to add a newline (n) after "string(" ... and since identifiers are not allowed special characters the server generates a syntax error when trying to parse the generated statement.&lt;/P&gt;
&lt;P&gt;I currently can't think of a solution other than to require that all column expressions in the input query have explicitly named (and unique) column names.&lt;/P&gt;
&lt;P&gt;Perhaps someone else can think of a solution to this issue?&lt;/P&gt;</description>
      <pubDate>Fri, 03 Feb 2012 14:37:38 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819069#M4849912</guid>
      <dc:creator>MarkCulp</dc:creator>
      <dc:date>2012-02-03T14:37:38Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819065#M4849908</link>
      <description>&lt;P&gt;You did ask for simple, right? ...just so I have that right &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;
&lt;PRE&gt;CREATE TABLE person (
   first_name    VARCHAR ( 100 ),
   member_since  DATE,
   last_seen     DATE );

INSERT person VALUES ( 'Glenn',  '2009-11-10', '2012-02-01' );
INSERT person VALUES ( 'Breck',  '2009-11-08', '2012-01-31' );
INSERT person VALUES ( 'Volker', '2009-11-11', '2012-01-30' );
COMMIT;

CREATE FUNCTION query_to_dataformat (
   IN @select LONG VARCHAR )
   RETURNS  LONG VARCHAR 
BEGIN
   DECLARE @unload LONG VARCHAR;
   DECLARE @result LONG VARCHAR;
   SET @unload = STRING (
      'UNLOAD ',
      @select,
      ' INTO VARIABLE @result ',
      ' DELIMITED BY ''^'' ',
      ' ROW DELIMITED BY ''],['' ',
      ' ESCAPES OFF HEXADECIMAL OFF QUOTES OFF' );
   EXECUTE IMMEDIATE @unload;
   RETURN STRING ( '[', LEFT ( @result, LENGTH ( @result ) - 2 ) );    
END;

SELECT query_to_dataformat ( 'SELECT first_name, member_since, last_seen FROM Person' );

query_to_dataformat('SELECT first_name, member_since, last_seen FROM Person')
[Glenn^2009-11-10^2012-02-01],[Breck^2009-11-08^2012-01-31],[Volker^2009-11-11^2012-01-30]
&lt;/PRE&gt;</description>
      <pubDate>Fri, 03 Feb 2012 15:08:45 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819065#M4849908</guid>
      <dc:creator>Breck_Carter</dc:creator>
      <dc:date>2012-02-03T15:08:45Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819070#M4849913</link>
      <description>&lt;P&gt;One could check whether the column_name returned by sa_describe_query is an identifier or not, and add an alias automatically in the latter case, something like:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="k"&gt;select&lt;/SPAN&gt; &lt;SPAN class="n"&gt;name&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt; &lt;SPAN class="k"&gt;case&lt;/SPAN&gt; &lt;SPAN class="k"&gt;when&lt;/SPAN&gt; &lt;SPAN class="n"&gt;name&lt;/SPAN&gt; &lt;SPAN class="k"&gt;not&lt;/SPAN&gt; &lt;SPAN class="n"&gt;regexp&lt;/SPAN&gt; &lt;SPAN class="s1"&gt;'\\w+'&lt;/SPAN&gt;
      &lt;SPAN class="k"&gt;then&lt;/SPAN&gt; &lt;SPAN class="s1"&gt;'MyColumn_'&lt;/SPAN&gt; &lt;SPAN class="o"&gt;||&lt;/SPAN&gt; &lt;SPAN class="n"&gt;column_number&lt;/SPAN&gt;
      &lt;SPAN class="k"&gt;else&lt;/SPAN&gt; &lt;SPAN class="n"&gt;name&lt;/SPAN&gt; &lt;SPAN class="k"&gt;end&lt;/SPAN&gt; &lt;SPAN class="k"&gt;case&lt;/SPAN&gt;
   &lt;SPAN class="k"&gt;as&lt;/SPAN&gt; &lt;SPAN class="n"&gt;name_or_alias&lt;/SPAN&gt;
&lt;SPAN class="k"&gt;from&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sa_describe_query&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;
  &lt;SPAN class="s1"&gt;'select top 3 table_id || table_id, "table_id", file_id as [alias with space] from systable order by table_id'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;)&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;returns&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;name,name_or_alias&lt;BR /&gt;
'tab.table_id || tab.table_id','MyColumn_1'&lt;BR /&gt;
'table_id','table_id'&lt;BR /&gt;
'alias with space','MyColumn_3'&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;When building the query, one could then use the &lt;EM&gt;name_or_alias&lt;/EM&gt; to build the query and use the original &lt;EM&gt;name&lt;/EM&gt; to build the column header...&lt;/P&gt;
&lt;P&gt;Note: The check with 'w+' is a simplification of the real rules for identifiers.&lt;/P&gt;</description>
      <pubDate>Fri, 03 Feb 2012 17:16:10 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819070#M4849913</guid>
      <dc:creator>VolkerBarth</dc:creator>
      <dc:date>2012-02-03T17:16:10Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819071#M4849914</link>
      <description>&lt;P&gt;...and surely Breck has taken the time to blog about that solution in detail &lt;A href="http://www.sqlanywhere.blogspot.com/2012/02/example-unload-into-variable-and.html"&gt;here&lt;/A&gt; ... and may not have taken the time to let the forum know:)&lt;/P&gt;</description>
      <pubDate>Wed, 08 Feb 2012 03:31:38 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819071#M4849914</guid>
      <dc:creator>VolkerBarth</dc:creator>
      <dc:date>2012-02-08T03:31:38Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819072#M4849915</link>
      <description>&lt;P&gt;In case there's a need to output the result set description  (say, as "first row") as well (though that's not specified by &lt;A href="https://sqlanywhere-forum.sap.com/users/34/ralph-wissing/"&gt;@Ralph&lt;/A&gt;), I guess one could use the UNLOAD with the APPEND option to concatenate the description and the result set into one string...&lt;/P&gt;</description>
      <pubDate>Wed, 08 Feb 2012 03:34:21 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819072#M4849915</guid>
      <dc:creator>VolkerBarth</dc:creator>
      <dc:date>2012-02-08T03:34:21Z</dc:date>
    </item>
    <item>
      <title>Re: Post Processing Result Set with Dynamic Query Input</title>
      <link>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819073#M4849916</link>
      <description>&lt;P&gt;This is fantastic, great solution! I think I stumbled upon the UNLOAD statement, but must have missed the fact it could be redirected to a variable instead of a file on disk. I am marking this solution as the "accepted" one because it appears to work for all the weird edge cases.&lt;/P&gt;</description>
      <pubDate>Mon, 13 Feb 2012 11:05:54 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/post-processing-result-set-with-dynamic-query-input/qaa-p/13819073#M4849916</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2012-02-13T11:05:54Z</dc:date>
    </item>
  </channel>
</rss>

