<?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: Splitting a comma separated string issue in Technology Q&amp;A</title>
    <link>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaa-p/13832546#M4863389</link>
    <description>&lt;P&gt;Thanks that sa_split_list is a very handy tool. I did just find out that some of the earlier Sybase versions we use(8) do not have this built in feature. Anything you would suggest for that or a way to modify my original sp_split_new_onet to allow the split of 'A,B,C'?&lt;/P&gt;</description>
    <pubDate>Fri, 13 Jul 2012 17:42:52 GMT</pubDate>
    <dc:creator>Former Member</dc:creator>
    <dc:date>2012-07-13T17:42:52Z</dc:date>
    <item>
      <title>Splitting a comma separated string issue</title>
      <link>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaq-p/13832544</link>
      <description>&lt;P&gt;Hi I am using Sybase 10 and am passing a comma separated string into a stored procedure to split into multiple rows. At the moment I am only able to get this working when I pass numbers in. Anytime I pass in a word or letter I get a message saying that column doesn't exist?&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="n"&gt;ALTER&lt;/SPAN&gt; &lt;SPAN class="n"&gt;PROCEDURE&lt;/SPAN&gt; &lt;SPAN class="s"&gt;"DBA"&lt;/SPAN&gt;&lt;SPAN class="o"&gt;.&lt;/SPAN&gt;&lt;SPAN class="s"&gt;"sp_split_data"&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="nv"&gt;@testData&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;500&lt;/SPAN&gt;&lt;SPAN class="p"&gt;))&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;@sql&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;8000&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;declare&lt;/SPAN&gt; &lt;SPAN class="nb"&gt;local&lt;/SPAN&gt; &lt;SPAN class="n"&gt;temporary&lt;/SPAN&gt; &lt;SPAN class="n"&gt;table&lt;/SPAN&gt; &lt;SPAN class="n"&gt;TempTable&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;testRecord&lt;/SPAN&gt; &lt;SPAN class="n"&gt;varchar&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="mi"&gt;500&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="p"&gt;)&lt;/SPAN&gt; &lt;SPAN class="n"&gt;on&lt;/SPAN&gt; &lt;SPAN class="n"&gt;commit&lt;/SPAN&gt; &lt;SPAN class="nb"&gt;delete&lt;/SPAN&gt; &lt;SPAN class="n"&gt;rows&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="n"&gt;set&lt;/SPAN&gt; &lt;SPAN class="nv"&gt;@sql&lt;/SPAN&gt;&lt;SPAN class="o"&gt;=&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'insert into TempTable select '&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;@testData&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;' union all select '&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&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;@sql&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;testRecord&lt;/SPAN&gt;
&lt;SPAN class="n"&gt;from&lt;/SPAN&gt; &lt;SPAN class="n"&gt;TempTable&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;end&lt;/P&gt;
&lt;P&gt;I call this stored procedure by: call sp_split_new_onet('1,2,3') and it will return the following:&lt;/P&gt;
&lt;P&gt;testrecord&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;1&lt;/LI&gt;
&lt;LI&gt;2&lt;/LI&gt;
&lt;LI&gt;3&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;But anytime I would execute the stored procedure call sp_split_new_onet('A,B,C') it would say the columns do not exist.&lt;/P&gt;
&lt;P&gt;So basically I am trying to find a way to split up a comma separated string where words/characters are passed in. Any help is appreciated.&lt;/P&gt;
&lt;P&gt;Thanks!&lt;/P&gt;</description>
      <pubDate>Tue, 10 Jul 2012 19:18:18 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaq-p/13832544</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2012-07-10T19:18:18Z</dc:date>
    </item>
    <item>
      <title>Re: Splitting a comma separated string issue</title>
      <link>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaa-p/13832545#M4863388</link>
      <description>&lt;P&gt;SQL Anywhere 10 should already have a mechanism built in for this purpose.&lt;/P&gt;
&lt;P&gt;Have you looked at the sa_split_list procedure?&lt;/P&gt;
&lt;P&gt;&lt;A href="http://dcx.sybase.com/index.html#1001/en/dbrfen10/rf-sa-set-http-option.html"&gt;sa_split_list system procedure&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;With your two examples you can execute:&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="n"&gt;CALL&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sa_split_list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'1,2,3'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;

&lt;SPAN class="ow"&gt;or&lt;/SPAN&gt;

&lt;SPAN class="n"&gt;CALL&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sa_split_list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'A,B,C'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;P&gt;This procedure also allows for different delimiters, so you could split the list on semi-colons, spaces, etc.&lt;/P&gt;
&lt;P&gt;Also, there are two columns presented by the stored procedure, but you could match your desired output by using a select list with an alias.&lt;/P&gt;
&lt;P&gt;I.e.&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;row_value&lt;/SPAN&gt; &lt;SPAN class="n"&gt;as&lt;/SPAN&gt; &lt;SPAN class="n"&gt;testRecord&lt;/SPAN&gt; &lt;SPAN class="n"&gt;FROM&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sa_split_list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'A,B,C'&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/DIV&gt;


&lt;HR /&gt;
&lt;P&gt;On a separate note, the sp_split_new_onet('A,B,C') is failing because it is looking for columns named A, B, and C; when executing sp_split_new_onet('1,2,3'), it succeeds because 1, 2, and 3 are being parsed as literals instead of column names.&lt;/P&gt;
&lt;P&gt;Hope This Helps!&lt;/P&gt;
&lt;HR /&gt;
&lt;P&gt;Since sa_split_list was introduced in version 10, you might need to resort to something else in earlier versions, something like the following may work (untested however):&lt;/P&gt;
&lt;DIV class="codehilite"&gt;&lt;PRE&gt;&lt;SPAN class="n"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="n"&gt;PROCEDURE&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sp_split_list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="n"&gt;str&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;delim&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;RESULT&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="n"&gt;record&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="k"&gt;BEGIN&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;DECLARE&lt;/SPAN&gt; &lt;SPAN class="n"&gt;last_pos&lt;/SPAN&gt; &lt;SPAN class="n"&gt;INTEGER&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;DECLARE&lt;/SPAN&gt; &lt;SPAN class="n"&gt;next_pos&lt;/SPAN&gt; &lt;SPAN class="n"&gt;INTEGER&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="n"&gt;IF&lt;/SPAN&gt; &lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="n"&gt;str&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;THEN&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="s"&gt;''&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;RETURN&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="n"&gt;SET&lt;/SPAN&gt; &lt;SPAN class="n"&gt;next_pos&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="n"&gt;LOCATE&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="n"&gt;str&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="n"&gt;delim&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
    &lt;SPAN class="n"&gt;SET&lt;/SPAN&gt; &lt;SPAN class="n"&gt;last_pos&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="mi"&gt;1&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

    &lt;SPAN class="n"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="n"&gt;TABLE&lt;/SPAN&gt; &lt;SPAN class="c1"&gt;#temp (&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;record&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;WHILE&lt;/SPAN&gt; &lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="n"&gt;next_pos&lt;/SPAN&gt; &lt;SPAN class="o"&gt;&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="n"&gt;LOOP&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;INSERT&lt;/SPAN&gt; &lt;SPAN class="c1"&gt;#temp VALUES(SUBSTR(str,last_pos,next_pos-last_pos));&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;SET&lt;/SPAN&gt; &lt;SPAN class="n"&gt;last_pos&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="n"&gt;next_pos&lt;/SPAN&gt;&lt;SPAN class="o"&gt;+&lt;/SPAN&gt;&lt;SPAN class="n"&gt;LENGTH&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="n"&gt;delim&lt;/SPAN&gt;&lt;SPAN class="p"&gt;);&lt;/SPAN&gt;
        &lt;SPAN class="n"&gt;SET&lt;/SPAN&gt; &lt;SPAN class="n"&gt;next_pos&lt;/SPAN&gt; &lt;SPAN class="o"&gt;=&lt;/SPAN&gt; &lt;SPAN class="n"&gt;LOCATE&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="n"&gt;str&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="n"&gt;delim&lt;/SPAN&gt;&lt;SPAN class="p"&gt;,&lt;/SPAN&gt;&lt;SPAN class="n"&gt;last_pos&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="n"&gt;INSERT&lt;/SPAN&gt; &lt;SPAN class="c1"&gt;#temp VALUES(SUBSTR(str,last_pos));&lt;/SPAN&gt;

    &lt;SPAN class="n"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="o"&gt;*&lt;/SPAN&gt; &lt;SPAN class="n"&gt;FROM&lt;/SPAN&gt; &lt;SPAN class="c1"&gt;#temp;&lt;/SPAN&gt;
&lt;SPAN class="k"&gt;END&lt;/SPAN&gt;&lt;SPAN class="p"&gt;;&lt;/SPAN&gt;

&lt;SPAN class="n"&gt;CALL&lt;/SPAN&gt; &lt;SPAN class="n"&gt;sp_split_list&lt;/SPAN&gt;&lt;SPAN class="p"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s"&gt;'my,string,to,split'&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;This approach steers away from REPLACE and EXECUTE IMMEDIATE, helping to avoid SQL injection or other potential pitfalls.&lt;/P&gt;</description>
      <pubDate>Tue, 10 Jul 2012 19:34:13 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaa-p/13832545#M4863388</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2012-07-10T19:34:13Z</dc:date>
    </item>
    <item>
      <title>Re: Splitting a comma separated string issue</title>
      <link>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaa-p/13832546#M4863389</link>
      <description>&lt;P&gt;Thanks that sa_split_list is a very handy tool. I did just find out that some of the earlier Sybase versions we use(8) do not have this built in feature. Anything you would suggest for that or a way to modify my original sp_split_new_onet to allow the split of 'A,B,C'?&lt;/P&gt;</description>
      <pubDate>Fri, 13 Jul 2012 17:42:52 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaa-p/13832546#M4863389</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2012-07-13T17:42:52Z</dc:date>
    </item>
    <item>
      <title>Re: Splitting a comma separated string issue</title>
      <link>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaa-p/13832547#M4863390</link>
      <description>&lt;P&gt;You could come up with something in SQL, I've edited my answer with a possible example.&lt;/P&gt;</description>
      <pubDate>Fri, 13 Jul 2012 18:37:51 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/splitting-a-comma-separated-string-issue/qaa-p/13832547#M4863390</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2012-07-13T18:37:51Z</dc:date>
    </item>
  </channel>
</rss>

