[RESOLVIDO]Problema ao selecionar uma parte de uma mensagem. SUBSTRING + CHARINDEX

Pessoal, é o seguinte, preciso pegar um pedaço de uma coluna, e inserir em outra coluna, o problema é que esse pedaço varia de tamanho, de acordo com o nome do usuário contido na menssagem.
OBS: ESTOU UTILIZANDO O SQL SERVER

segue como a tabela está no momento.

O que quero fazer é pegar o nome do usuário na coluna nmMensagem, no exemplo acima ADMIN e inserir na coluna nmUsuario.

O comando que utilizei está pegando mais do que o nome, e se eu diminuo o número “9” do meu comando acaba cortando alguns usuários com nomes maiores.

UPDATE tabLogUsuario  
SET nmUsuario = SUBSTRING(nmMensagem, 8, CHARINDEX(' ', nmMensagem, 9))  
WHERE idLog IN (SELECT idLog FROM tabLogUsuario)  

O que eu posso fazer, me ajudem plz.

Att,

Vc poderia fazer algo do tipo SUBSTRING(nmMensagem, 8, CHARINDEX( onde começa a primeira palavra após o nome do admin))

No caso, seria tipo “inseriu a”

[quote=jakefrog]Vc poderia fazer algo do tipo SUBSTRING(nmMensagem, 8, CHARINDEX( onde começa a primeira palavra após o nome do admin))

No caso, seria tipo “inseriu a”[/quote]

Mas é exatamente essa posição onde começa a primeira palavra após o nome do admin que varia, tem hora que por exemplo, tem hora que é 10, tem hora que é 12, depende do tamanho do nome do usuário.

devo inserir a string ‘inseriu a’ é isso que você quis dizer?

Uma vez que a palavra inseriu sempre vem depois do nome do usuário, a primeira posição dela seria o fim da string que você quer pegar.

Não cheguei a olhar muito bem o código queria apenas te dar uma idéia de como fazer! =D

amigo, obrigado por tentar ajudar, mas realmente você não leu direito rsrs.

eu estou tentando trazer o nome do usuario de uma coluna que já existe, e a palavra que ‘inseriu’ vem depois do nome, mas depos de inseriu tem muitas outras palavras.

att

ops, foi mals. :blush:

alguém pode ajudar?

Procura por funções de split, como por exemplo esta.

o problema é que não sei utilizar, essa função já está pronta para uso?

como usuaria ela?

criei essa função, mas não sei como utiliza-la no meu caso.

helpp

Pelo que me parece tu queres fazer o split por espaço e depois obter o terceiro registo, certo?

então na verdade eu quero usar o split para obter a posição do SEGUNDO espaço em branco.

Usuário FULANO acessou

quero obter a posição entre FULANO e acessou. para depois fazer uma substring, selecionando apenas a palavra FULANO. o problema é que nem sempre é fulano, se for FULANO1 a posição já serie diferente.

por isso necessito do split. utilizando charindex, não consegui. como você pode ver no sql abaixo

UPDATE tabLogUsuario  
SET nmUsuario = SUBSTRING(nmMensagem, 8, CHARINDEX(' ', nmMensagem, 9))  
WHERE idLog IN (SELECT idLog FROM tabLogUsuario)

valeu

Se criaste a função como está no exemplo penso que algo deste género deve dar o que queres

UPDATE tabLogUsuario    
SET nmUsuario = (select * from
(select ROW_NUMBER() over (order by item) as RowNum, * from fnSplit(nmMensagem, ' ')) t
where RowNum = 2)
WHERE ....

[quote=pmlm]Se criaste a função como está no exemplo penso que algo deste género deve dar o que queres

UPDATE tabLogUsuario SET nmUsuario = (select * from (select ROW_NUMBER() over (order by item) as RowNum, * from fnSplit(nmMensagem, ' ')) t where RowNum = 2) WHERE .... [/quote]

infelismente não funcionou

codigo:

UPDATE tabLogUsuario      
SET chaUsuario = (select * from  
(select ROW_NUMBER() over (order by item) as RowNum, * from fnSplit(chaMensagem, ' ')) t  
where RowNum = 2)  
WHERE idLog IN (SELECT a.idLog FROM tabLogUsuario a)

erro:

Devem faltar alguns ajustes… Não pode ser feito o select * no set.
Se fizeste igual ao do exemplo deverá ser item.

UPDATE tabLogUsuario      
SET chaUsuario = (select item from  
(select ROW_NUMBER() over (order by item) as RowNum, * from fnSplit(chaMensagem, ' ')) t  
where RowNum = 2)  
WHERE idLog IN (SELECT a.idLog FROM tabLogUsuario a)

Se vires no link que te enviei, mais abaixo alguém alterou a função para retornar uma determinada posição.

Com isso deves conseguir fazer um SQL mais simples

    UPDATE tabLogUsuario        
    SET chaUsuario =  fnSplit(chaMensagem, ' ', 2)
    WHERE idLog IN (SELECT a.idLog FROM tabLogUsuario a)  

não consigo alterar a função

ALTER FUNCTION [dbo].[fnSplit](@sInputList VARCHAR(8000),@sDelimiter VARCHAR(8000) = ',',@Index INT) 
RETURNS NVARCHAR(4000) 
BEGIN 
DECLARE @sItem VARCHAR(8000) 
DECLARE @retval NVARCHAR(4000) 
DECLARE @tempIndex INT 
DECLARE @List TABLE(item VARCHAR(8000)) 
SET @tempIndex = 0 
WHILE Charindex(@sDelimiter,@sInputList,0) <> 0 
BEGIN 
SELECT @sItem = Rtrim(Ltrim(Substring(@sInputList,1,Charindex(@sDelimiter,@sInputList,0) - 1))), 
@sInputList = Rtrim(Ltrim(Substring(@sInputList,Charindex(@sDelimiter,@sInputList,0) + Len(@sDelimiter), 
Len(@sInputList)))) 
IF Len(@sItem) > 0 
INSERT INTO @List 
SELECT @sItem 
IF (@tempIndex = @Index) 
SET @retval = @sItem 
SET @tempIndex = @tempIndex + 1 
END 
IF Len(@sInputList) > 0 
INSERT INTO @List 
SELECT @sInputList -- Put the last item in 
IF (@tempIndex = @Index) 
SET @retval = @sItem 
RETURN @retval 
END 
GO 

erro

Se não consegues alterar, apaga e volta a criar.

já tentei e não consegui.

o que devo fazer? crar apartir do código alter table?

preciso urgente resolver isso. por favor ajude-me