none
Ajuda para Atualizar campo RRS feed

  • Pergunta

  • Olá amigos,

    Estou precisando de uma grande ajuda. Estou precisando uma query para atualizar um campo caso.
    Tenho uma base com todos os dados da pessoa certo, mas essa pessoa esqueceu de preencher o campo sexo. Agora minha função na query e pegar o campo nome, caso ele termine com 'O' ele atualiza o campo sexo como Masculino, Caso termine com 'A' ele atualiza como Feminino. Entendeu?

    Agradeço muito quem poder me ajudar nessa solução.

    Abs a todos.
    quarta-feira, 3 de fevereiro de 2010 16:13

Todas as Respostas

  • Bruno,

    Esta maneira não é 100% certa, pq existem nomes que nao terminal com O ou A e existem homem que terminam com A  (Djalma)

    segue o script

    declare @teste as table (nome varchar(max))
    insert into @teste values('Marcelo Fernandes')
    insert into @teste values('Maria Teste da Silva')
    insert into @teste values('Djalma Santos')
    select nome, case right(substring(nome,0,patindex('% %',nome)),1) when 'o' then 'M' when 'a' then 'F' Else '?' End as 'Sexo'
    from @teste

    att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    quarta-feira, 3 de fevereiro de 2010 16:39
  • Bruno,

    Fica muito complicado para o SQL Server analisar e determinar em quais posições do seu campo contém os caracteres desejados para realizar a comparação.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 4 de fevereiro de 2010 10:34
  • Não há uma regra de nome para classficar o sexo.
    O que vc fizer nao irá resolver seu problema, a solução completa é ligar para o cliente e descobrir o sexo, e no banco nao permtir null no sexo, para dar erro e obrigar o preenchimento


    Marcos
    sexta-feira, 5 de fevereiro de 2010 22:46
  • Bruno, a sugestão do Marcelo funciona se você deseja atualizar por esse critério, mas não seria o ideal como o próprio exemplo do Marcelo (Djalma) demonstra.

    Não sei qual o tamanho dessa sua base, mas talvez você tentar outras abordagens.
    Faça um dicionário, use esse comando para extrair os nomes:

    SELECT DISTINCT 
    		PrimeiroNome = CASE
    			WHEN CHARINDEX(' ', Nome) > 0 THEN LEFT(Nome, (CHARINDEX(' ', Nome) - 1))
    			ELSE Nome
    	   	END
    	  ,Sexo = CAST(NULL AS NCHAR(1))
      INTO #nomes
      FROM dbo.tbl_Cadastro
    Se não houver espaço no nome da pessoa, retorna o nome completo (para isso o case). Note que inclui um campo Sexo, dessa forma você avalia os nomes do dicionário e vai dando um UPDATE no campo Sexo naqueles que considera como Homem ou Mulher. Se houverem nomes que você estiver em dúvida, exclua-os desse dicionário.

    Feito isso, basta montar um Update através do seu dicionário para atualizar o campo sexo, o comando pode ser assim:

    UPDATE Cad
        SET Sexo = #nomes.Sexo
      FROM dbo.tbl_Cadastro AS Cad
      JOIN #nomes
        ON CASE
    	WHEN CHARINDEX(' ', @Name) > 0 THEN LEFT(@Name, (CHARINDEX(' ', @Name) - 1))
    	ELSE @Name
      END = #nomes.PrimeiroNome
    Note que tive que replicar o case da primeira query para que ele trouxesse o primeiro nome com a mesma lógica, mas você poderia fazer isso de outra forma, como com uma Coluna Computada na tabela de cadastro por exemplo, assim o código ficaria mais limpo.

    Esse método talvez não resolva todos os seus nomes, mas pode ajudar a fazer uma boa limpeza no que esta errado, e dai o restante você como pode atualizar.

    Espero que possa ser útil.
    Obrigado.
    Rafael Veronezi
    Database Administrator | BI Analyst
    Twitter: ravero
    Blog: http://raver0.wordpress.com
    quarta-feira, 10 de fevereiro de 2010 04:23
  • Boa tarde galera, eu retomei ao mesmo erro, devido as demandas tipo que parar essa base por esse tempo.

    Bom tem como eu conseguir atualizar uma base que nao estar preenchico 250.000 mil nomes sem o campo sexo?

    Pois agora estou com urgencia, caso alguem possa me ajudar agradecido mesmo.

    Bem nada  impossivel como dizem, mas e muito trabalho fazer isso tudo com uma base de 250.000 mil nomes. Me de alguma luz please..

    thanks.

    att
    terça-feira, 23 de fevereiro de 2010 19:40
  • Bruno,

    Dizer que não tem é mentira, mas com certeza você terá um pouco de trabalho e além disso, poderá enfrentar problemas de lentidão se for você atualizar este quantidade de registro de uma única vez.

    Teriamos que pensar em dimensionar este quantidade de atualizações por faixa de registros!!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 25 de fevereiro de 2010 12:48
  • Bom dia Junior,
    ,
    Entendeu, teria como me ajudar em algum exemplo de query, para mim iniciar, pq nem sei como começar, apenas fiz o mais facil, que era separar todos os em branco do campo sexo.

    Agradeço pela ajuda.
    quinta-feira, 25 de fevereiro de 2010 15:23
  • Bruno,

    Você separou os em branco do campo sexo e agora deseja utilizar este mesmos dados informando seus sexos?

    Qual é o SQL Server que você esta utilizando?


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 25 de fevereiro de 2010 19:56
  • Bom dia Junior,

    Isso mesmo, estou usando o SQL 2000.

    Aguardo o retorno.
    sexta-feira, 26 de fevereiro de 2010 14:18
  • update Tabela
    set camposexo =  case when right(replace(camponome,' ',''),1) = 'A' then 'FEMININO' when right(replace(camponome,' ',''),1) = 'O' then 'MASCULINO' else camposexo end


    Assim ele vai alterar sexo quando o camponome terminar com 'A' ou 'O' e caso não termine com nenhuma das duas ele Mantem o valor do camposexo.

    O Replace serve para não correr o risco do ultimo caracter ser um espaço em branco.

    Espero ter ajudado.

    quinta-feira, 4 de março de 2010 13:12
  • Bom dia, Ceallopes

    Agradeço pela sua ajuda, mas o que eu percebi nesta query está pegando qualquer parte, como exemplo Sobrenome, na query preciso pegar só o primeiro NOME e caso for A = F e O = M...

    Estou rodando está query..

    update tabela
    set sexo = case right(substring(nome,0,patindex('% %',nome)),1)
    when 'o' then 'M' when 'a' then 'F' Else 'I' END

    Está atualizando, certinho só que ele tá colocando os Indefinido os que termina com R, L, S e etc. Preciso só atribuir os que estão em branco e nesta condição se FOR 
    A = F e O = M...

    Agradeço mesmo pela ajuda.

    Att.
    quinta-feira, 4 de março de 2010 19:12
  • Bruno criei um script para atualizar primeiro rode na base e verifique o resultado 

    se for satisfatório comente a linha do insert e a do select no final e retire o comentário a linha do update alterando tanto o update quanto o select do cursor para a tabela desejada.

    Declare @cString VarChar(Max)
    Declare @cNome VarChar(Max)
    Declare @cSexo Char(1)
    Declare @nPos  Int
    
    Declare @Tmp Table  (Nome VarChar(Max),Sexo Char(1))
    
    Declare cCursor cursor For
    Select  Nome From Nome Where Sexo = ' ' -- Altere aqui para pegar a tabela desejada
    
    Open cCursor
    
    Fetch From cCursor Into @cNome
    
    While @@Fetch_Status = 0
    Begin
    	Set @cString = @cNome 
    	Set @nPos	 = CharIndex(' ',@cString)-- pego a posição do espaço 
    	Set @cString = SubString(Substring(@cString,@nPos-1,Len(@cString)),1,1) -- Toda a logica se resumi aqui onde eu pego o 1º espaço e com base nisso eu pego somente a ultima letra antes do espaço
    	
    	--Depois disso verifico se é Masculino ou Feminno
    
    	If Upper(@cString) In ('A','O') 
    		Begin
    			If Upper(@cString) = 'A' 
    				Begin
    					Set @cSexo = 'F'
    				End
    			If Upper(@cString) = 'O' 
    				Begin
    					Set @cSexo = 'M'
    				End
    	End
    	--Update Nomes Set Sexo = @cSexo Where Current Of cCursor --altere aqui para fazer update na tabela desejada
    	
    	Insert into @Tmp Values(@cNome,@cSexo)
    	
    	Fetch Next From cCursor Into @cNome
    
    End
    
    Close cCursor
    Deallocate cCursor
    
    Select * From @Tmp
    

    Espero ter ajudado..

    Att,

    Fernando Willian de Souza Furtado

    Se útil classifique obrigado...

    terça-feira, 6 de abril de 2010 19:14