Imagine a seguinte situacao: voce possui uma string, separada por ponto e virgula, e voce deseja separar estas strings para realizar um tratamento. Vamos ver um exemplo abaixo: string1; string2; "string 3 com ; no meio"; string4 Entao nos temos quatro valores concatenados em uma unica string. Observe que o terceiro valor utiliza o ponto e virgula como texto da propria string, porem a sentenca toda esta entre aspas (), o que determina que o ponto e virgula desta frase faz parte da string, e nao e um caracter separador. Para resolver esta questao, eu desenvolvi o seguinte procedimento: -- exec spSplit 'string1; string2; "string3 com ; no meio"; string4', ';' alter proc spSplit @grupo varchar(8000), @caracter char(1) = NULL as begin -- *************** -- SQL Burger 2011 -- Funcao SPLIT, separa string dividida por -- caracter de controle. Esta funcao so pode ser -- utilizada e distribuida caso os creditos ao autor -- sejam citados. -- *************** if @caracter is null set @caracter = ',' declare @pos int declare @buffer varchar(8000) declare @buffer2 varchar(8000) create table #ret (texto varchar(8000) null, ordem int not null identity(1,1)) while charindex('"', @grupo) > 0 begin select @pos = charindex('"', @grupo) select @buffer = left(@grupo, @pos) select @grupo = substring(@grupo, @pos + 1, len(@grupo)) select @pos = charindex('"', @grupo) select @buffer2 = left(@grupo, @pos) select @grupo = substring(@grupo, @pos + 1, len(@grupo)) select @buffer = replace(@buffer, '"','') , @buffer2 = replace(@buffer2, '"', '') select @buffer2 = replace(@buffer2, @caracter, char(254)) select @buffer2 = replace(@buffer2, ';', char(253)) select @grupo = rtrim(@buffer) + rtrim(@buffer2) + rtrim(@grupo) end while charindex(@caracter,@grupo) > 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), ';') insert into #ret (texto) select rtrim(ltrim(@buffer)) end if @grupo <> '' begin select @buffer =replace(@grupo,@caracter,'') insert into #ret (texto) select rtrim(ltrim(@buffer)) end select texto from #ret order by ordem end O procedimento recebe dois parametros: @grupo (que e string a ser tratada) e @caracter (o caracter de controle a ser utilizado para separar a string). O resultado e o seguinte: exec spSplit 'string1; string2; "string3 com ; no meio"; string4', '!' A procedure ira retornar cada string em uma linha, permitindo trata-las da maneira como quiser. Uma dica, utilize uma tabela temporaria com uma coluna auto-numerica, e voce sabera exatamente qual linha ler de acordo com a posicao desejada: set nocount on create table #split ( texto varchar(100) null , ordem int not null identity ) insert into #split (texto) exec spSplit 'string1; string2; "string3 com ; no meio"; string4', ';' select texto as 'Primeiro parametro' from #split where ordem = 1 select texto as 'Segundo parametro' from #split where ordem = 2 select texto as 'Terceiro parametro' from #split where ordem = 3 select texto as 'Quarto parametro' from #split where ordem = 4 drop table #split Desta forma, o numero da linha correspondera ao parametro: Outros caracteres de controle poderao ser utilizados, trazendo o mesmo resultado: exec spSplit 'string1! string2! "string3 com ; no meio"! string4', '!'