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)
[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?
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.
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)
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)
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)
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