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:
string1; string2; "string 3 com ; no meio"; string4
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:
- -- exec spSplit 'string1; string2; "string3 com ; no meio"; string4', ';'
- alter proc spSplit
- @grupo varchar(8000),
- @caracter char(1) = NULL
- as
- begin
- -- ***************
- -- 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 = ','
- 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 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:
- exec spSplit 'string1; string2; "string3 com ; no meio"; string4', '!'
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:
- 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 número da linha corresponderá ao parâmetro:
Outros caracteres de controle poderão ser utilizados, trazendo o mesmo resultado:
- exec spSplit 'string1! string2! "string3 com ; no meio"! string4', '!'
- exec spSplit 'string1! string2! "string3 com ! no meio"! string4', '!'
Espero que seja útil!
Nenhum comentário:
Postar um comentário