SPLIT STRING – Função para dividir uma string por um caracter de controle
Autor: Fabiano Cores | Publicado: 2011-06-17T03:04:00-03:00

Imagine a seguinte situação: você possui uma string, separada por ponto e vírgula, e você deseja separar estas strings para realizar um tratamento. Vamos ver um exemplo abaixo: &nbsp; string1; string2; "string 3 com ; no meio"; string4 &nbsp; Então nós temos quatro valores concatenados em uma única string. Observe que o terceiro valor utiliza o ponto e vírgula como texto da própria string, porém a sentença toda está entre aspas (“), o que determina que o ponto e virgula desta frase faz parte da string, e não é um caracter separador. Para resolver esta questão, eu desenvolvi o seguinte procedimento: &nbsp;     -- exec spSplit &#39;string1; string2; &quot;string3 com ; no meio&quot;; string4&#39;, &#39;;&#39; alter proc spSplit   @grupo varchar(8000),   @caracter char(1) = NULL as &nbsp; begin &nbsp;   -- ***************   -- SQL Burger 2011   -- Função SPLIT, separa string dividida por   -- caracter de controle. Esta função só pode ser   -- utilizada e distribuída caso os créditos ao autor   -- sejam citados.   -- ***************      if @caracter is null set @caracter = &#39;,&#39; &nbsp;   declare @pos int   declare @buffer varchar(8000)   declare @buffer2 varchar(8000) &nbsp;   create table #ret (texto varchar(8000) null, ordem int not null identity(1,1)) &nbsp;   while charindex(&#39;&quot;&#39;, @grupo) &gt; 0   begin &nbsp;     select @pos = charindex(&#39;&quot;&#39;, @grupo) &nbsp;     select @buffer = left(@grupo, @pos) &nbsp;     select @grupo = substring(@grupo, @pos + 1, len(@grupo)) &nbsp;     select @pos = charindex(&#39;&quot;&#39;, @grupo) &nbsp;     select @buffer2 = left(@grupo, @pos) &nbsp;     select @grupo = substring(@grupo, @pos + 1, len(@grupo)) &nbsp;     select @buffer = replace(@buffer, &#39;&quot;&#39;,&#39;&#39;)          , @buffer2 = replace(@buffer2, &#39;&quot;&#39;, &#39;&#39;) &nbsp;     select @buffer2 = replace(@buffer2, @caracter, char(254))          select @buffer2 = replace(@buffer2, &#39;;&#39;, char(253)) &nbsp;     select @grupo = rtrim(@buffer) + rtrim(@buffer2) + rtrim(@grupo) &nbsp;   end      while charindex(@caracter,@grupo) &gt; 0   begin     select @pos = charindex(@caracter,@grupo)     select @buffer = left(@grupo,@pos - 1)     select @grupo = right(@grupo,len(rtrim(@grupo)) - @pos)          select @buffer = replace(@buffer, char(254), @caracter)     select @buffer = replace(@buffer, char(253), &#39;;&#39;)          insert into #ret (texto)       select rtrim(ltrim(@buffer))   end &nbsp;   if @grupo &lt;&gt; &#39;&#39;   begin     select @buffer =replace(@grupo,@caracter,&#39;&#39;) &nbsp;     insert into #ret (texto)       select rtrim(ltrim(@buffer))   end &nbsp;   select texto from #ret order by ordem &nbsp; end     &nbsp; O procedimento recebe dois parâmetros: @grupo (que é string a ser tratada) e @caracter (o caracter de controle a ser utilizado para separar a string). O resultado é o seguinte: &nbsp;     exec spSplit &#39;string1; string2; &quot;string3 com ; no meio&quot;; string4&#39;, &#39;!&#39;     &nbsp; &nbsp;  &nbsp; A procedure irá retornar cada string em uma linha, permitindo tratá-las da maneira como quiser. Uma dica, utilize uma tabela temporária com uma coluna auto-numérica, e você saberá exatamente qual linha ler de acordo com a posição desejada: &nbsp;      set nocount on &nbsp; create table #split (   texto varchar(100) null , ordem int not null identity ) &nbsp; insert into #split (texto)   exec spSplit &#39;string1; string2; &quot;string3 com ; no meio&quot;; string4&#39;, &#39;;&#39;    select texto as &#39;Primeiro parametro&#39; from #split where ordem = 1 select texto as &#39;Segundo parametro&#39; from #split where ordem = 2 select texto as &#39;Terceiro parametro&#39; from #split where ordem = 3 select texto as &#39;Quarto parametro&#39; from #split where ordem = 4 &nbsp; &nbsp; drop table #split     &nbsp; Desta forma, o número da linha corresponderá ao parâmetro: &nbsp; &nbsp;  &nbsp; Outros caracteres de controle poderão ser utilizados, trazendo o mesmo resultado: &nbsp;     exec spSplit &#39;string1! string2! &quot;string3 com ; no meio&quot;! string4&#39;, &#39;!&#39;     &nbsp;   &nbsp;      exec spSplit &#39;string1! string2! &quot;string3 com ! no meio&quot;! string4&#39;, &#39;!&#39;      &nbsp; &nbsp;  &nbsp; Espero que seja útil!