suriano Postado Janeiro 7, 2011 Denunciar Share Postado Janeiro 7, 2011 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Cosme Ferreira Postado Janeiro 7, 2011 Denunciar Share Postado Janeiro 7, 2011 (editado) 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 Janeiro 7, 2011 por Cosme Ferreira Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Janeiro 7, 2011 Denunciar Share Postado Janeiro 7, 2011 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!! :.) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Janeiro 7, 2011 Denunciar Share Postado Janeiro 7, 2011 É 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 suriano Postado Janeiro 7, 2011 Autor Denunciar Share Postado Janeiro 7, 2011 Obrigado.Vou testar.Não possuo o arquivo xml. O cliente me passou a query. O campo que recebe este texto é do tipo varchar(max).......... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Janeiro 7, 2011 Denunciar Share Postado Janeiro 7, 2011 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". Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Cosme Ferreira Postado Janeiro 8, 2011 Denunciar Share Postado Janeiro 8, 2011 Nessa eu fiquei no chinelo... lol.... bora jogar a função no lixo.. lolNunca trabalhei com xml no banco, mas vou dar uma pesquisada porque achei interessante! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
suriano
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
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.