Ir para conteúdo
Fórum Script Brasil
  • 0

Como capturar string entre as tags cpf


suriano

Pergunta

Dentro de um campo varchar(max) trago a string abaixo.

<?xml version = "1.0" encoding = "UTF-8"?> <Usr_Acs xmlns="Oficial"> <UsrIdfUsr>39320</UsrIdfUsr> <UsrNumCpf>44444444444</UsrNumCpf> <UsrCodSit>A</UsrCodSit>

Como capturo apenas os numeros do cpf para que possa trabalhar com ele????????????

Obrigado.

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Lá vai uma função... lol....

use pecus_d
go
alter FUNCTION fncBuscaParametro
(
@Texto varchar(8000),
@expressao varchar(256)
)
RETURNS @Tabretorno TABLE 
(
    cpf            varchar(256)    
)
as
begin

    declare @tamanho    int,
        @posicao        int,
        @cpf            int,
        @numCpf         varchar(20),
        @caracter       char(1),
        @ultimoCaracter char(1)
        
    
    set @tamanho        = len(@Texto)
    set @posicao        = 1
    set @cpf            = 0
    set @caracter       = ''
    set @numCPF      = ''
    
    
    set @texto = REPLACE( REPLACE(@texto,':','') , ' ', '')
    
    set @cpf = PATINDEX('%'+@Expressao+'%',@texto)
        
        if @cpf > 0
        set @posicao = @cpf + len(@Expressao)
    
    while (@posicao <= @tamanho)
    begin
        
        set @caracter = substring(@texto,@posicao,1)
        
        if @caracter in ('0','1','2','3','4','5','6','7','8','9')
        begin
          set @numCpf = @numCpf + @caracter
        end
        else
        begin
            select @posicao = @tamanho + 1
        end
        
        
        set @posicao = @posicao + 1
    end
    
    
    
    


   insert into @tabretorno 
   values(@numCPF)

   
   return
end

 go

--Para utilizar:

select * from fncBuscaParametro('<?xml version = "1.0" encoding = "UTF-8"?> <Usr_Acs xmlns="Oficial"> <UsrIdfUsr>39320</UsrIdfUsr> <UsrNumCpf>44444444444</UsrNumCpf> <UsrCodSit>A</UsrCodSit> ','<UsrNumCpf>')

--você pode alterar a função pra não retornar o tipo table.... fiz assim porque gosto do tipo table.. hauahuahuahauah

Editado por Cosme Ferreira
Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Suriano,

O seu script xml está faltando a tag </Usr_Acs>. Verifique pra mim por favor.

Ficaria assim:

'<Usr_Acs xmlns="Oficial"> <UsrIdfUsr>39320</UsrIdfUsr> <UsrNumCpf>44444444444</UsrNumCpf> <UsrCodSit>A</UsrCodSit></Usr_Acs>'
Qual sql você utiliza? Se for a partir do 2005, você poderá ler o string diretamente nos nodes, utilizando a função VALUE. Para isto, terá que declarar uma variável e inserir o resultado lido diretamente da estrutura xml. Perceba que quando dá o select na tabela onde está o xml, o campo vem "linkado". Se clicar, o próprio sql abre uma tela identando os nós. O select ficaria mais ou menos assim:
DECLARE @Cpf varchar(XXX)
SET @Cpf = ( SELECT coluna.value('(/Usr_Acs/UsrNumCpf/text())[1]', 'varchar(XXX)')
 FROM Tabela WHERE .... )

Dica: se em 1 nó você tiver mais de um valor, pode identificar qual posição você quer: o 1º, 2º, etc...

Há muitos tutorias na net q explica passo a passo!! :.)

Link para o comentário
Compartilhar em outros sites

  • 0

É isso mesmo... o seu XML está incorreto.

Seguinte.... no seu script, há o nó Usr_Acs xmlns="Oficial". Neste caso (creio eu) está errado, pois o correto seria a identificação de quantos subnós este nó vai ter.

Sendo assim o certo seria: Usr_Acs xmlns="4". No primeiro subnó, você identifica o tipo que colocou "Oficial".

Nos demais subnós, são os valores que colocou mesmo. Aí basta dar um select para navegar no xml.

Postei um exemplo pra você testar. Espero que ajude:

Create Table #TesteXML (CodigoID int, dados xml)

INSERT INTO #TesteXML (codigoid, dados) VALUES (100, 
'<?xml version = "1.0" encoding = "UTF-8"?> <Usr_Acs Total="4"> <xmlns>Oficial</xmlns>
<UsrIdfUsr>39320</UsrIdfUsr> <xmlns>Oficial</xmlns><UsrNumCpf>44444444444</UsrNumCpf> 
<UsrCodSit>A</UsrCodSit></Usr_Acs>')

-- Recupera o tipo
DECLARE @Tipo NVARCHAR(50)
SET @Tipo = ( SELECT dados.value('(/Usr_Acs/xmlns/text())[1]', 'nvarchar(50)')
FROM #TesteXML WHERE codigoid = 100)
SELECT  @Tipo

-- Recupera o Cpf
DECLARE @Cpf NVARCHAR(50)
SET @Cpf = ( SELECT dados.value('(/Usr_Acs/UsrNumCpf/text())[1]', 'nvarchar(50)')
FROM #TesteXML WHERE codigoid = 100)
SELECT  @Cpf

Link para o comentário
Compartilhar em outros sites

  • 0

O campo que recebe o xml é varchar(max), mas você pode alterá-lo para xml (que será o correto). Com esta alteração, o sql já identifica se está no padrão xml, não havendo problema de ter um "pedaço" do código apenas.

Se não me engano, desde o sql 2000 o xml é nativo. Se o cliente lhe passa um código xml, fica mais fácil você tratá-lo como tal, do que gravá-lo como string e ficar "procurando" onde está o cpf. Caso o cliente te passe um xml com 20 usuários, onde cada um tenha seu cpf distinto, fica praticamente inviável ficar rastreando a string para capturar as informações. A ferramenta já dá uma oportunidade boa.

Estou falando isto, pois já troquei dados com o Ministério da Saúde via xml. A estrutura é enorme!!! rs. Rastrear caracteres é praticamente impossível, fora o tempo gasto (tempo real e de processamento).

Fica ai a dica!!! :.)

Palavras de um professor (e olhe q tem muito tempo q formei... rs.):

"Programe bem para uma micro empresa de 3 pessoas, que programará bem para uma multinacional".

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...