Bruno, I initially thought of using the comment separator (blank line, which means double CR+LF) as the comment separator. It would be simple to implement, but it would not be a good strategy. So I chose to use the comment date/time as an identifier (header) of a new comment.
For the tests the following table was created:
-- código #1
CREATE TABLE tbComentário (
Id varchar(20),
DataAbertura datetime,
Comentários varchar(2000)
);
set dateformat dmy;
INSERT into tbComentário values
('Ticket116685', '4/5/2017 11:55:02',
'02-06-2017 15:38:48 - Tiago Caeiro (Comentários adicionais)
Para resolução
31-05-2017 19:37:58 - Tiago Caeiro (Comentários adicionais)
Enviado mail para equipa para validar as dúvidas/questões colocadas.
31-05-2017 19:28:42 - Pedro Aparício (Comentários adicionais)
Tiago, se quiser, pode-me contactar agora.');
go
The function code looks like this:
-- código #2
CREATE FUNCTION separaElementos (@ID varchar(20), @pComentários varchar(8000))
returns @Comentários table (ID varchar(20), Seq int, dataC datetime, autorC varchar(100), textoC varchar(2000))
begin
-- analisa parâmetro
IF len(ltrim(@pComentários)) = 0
or @pComentários is NULL
return;
--
declare @xComentários varchar(8000), @pos1 int, @pos2 int;
declare @dataC varchar(30), @autorC varchar(100), @textoC varchar(2000), @Seq int;
declare @CRLF char(2) = char(13)+char(10);
set @xComentários= ltrim(rtrim(@pComentários)) + char(26);
set @Seq= 0;
while left(@xComentários, 1) <> char(26)
begin
--- obtém a data do comentário adicional
set @pos1= patindex('%[0-3][0-9]-[0-1][0-9]-[0-2][0-9][0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9] %', @xComentários);
IF @pos1 = 0 break;
set @dataC= substring(@xComentários, @pos1, 19)
-- pula separador
set @pos1= charindex(' - ', @xComentários, (@pos1 +19));
IF @pos1 = 0 break;
set @pos1+= 3;
--- obtém o autor do comentário
set @pos2= charindex(' (Comentários', @xComentários, @pos1);
IF @pos2 = 0 break;
set @autorC= substring(@xComentários, @pos1, (@pos2 - @pos1));
-- pula trecho " (Comentários adicionais)"
set @pos1= @pos2 + len(' (Comentários adicionais)');
IF substring(@xComentários, @pos1, 2) = @CRLF
set @pos1+= 2;
-- retira trecho anterior do ponteiro
set @xComentários= substring(@xComentários, @pos1, 8000);
set @pos1= 1;
-- obtém posição final do comentário
set @pos2= patindex('%[0-3][0-9]-[0-1][0-9]-[0-2][0-9][0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9] %', @xComentários);
if @pos2 = 0
-- procura caractere finalizador (^Z)
set @pos2= charindex(char(26), @xComentários, @pos1);
if @pos2 = 0 break;
--- obtém o texto do comentário
set @textoC= substring(@xComentários, @pos1, (@pos2 - @pos1));
-- retira CRLF duplo ao final, se houver
IF right(@textoC, 4) = replicate(@CRLF, 2)
set @textoC= left(@textoC, (len(@textoC) -4));
-- retira trecho anterior do ponteiro
set @xComentários= substring(@xComentários, @pos2, 8000);
set @pos1= 1;
-- acrescenta informações de comentário na tabela de retorno
set @Seq+= 1;
INSERT into @Comentários values
(@ID, @Seq, convert(datetime, @dataC, 103), @autorC, @textoC)
end;
return;
end;
go
Finally, to trigger the function, using the test data:
-- código #3
select T1.ID, T1.DataAbertura, T2.Seq, T2.dataC, T2.autorC, T2.textoC
from tbComentário as T1
outer apply dbo.separaElementos (T1.ID, T1.Comentários) as T2
go
That is the result:
You can paste the contents of the lines to analyze?
– Sorack
@Brunopers: There’s always a blank line between the comments on the same ticket?
– José Diz
Yes, there is always!
– Bruno Peres
@Brunoperes edit the response and add the text to get the correct formatting
– Sorack
@Sorack edited and pasted into question. : ) Could not comment.
– Bruno Peres