Olá pessoal,
Bom dia.
Neste post rápido, vou demonstrar mais uma vez o uso de procedures OLE Automation para consumir informações na Web e trazer para o nosso banco SQL Server, de forma que possamos trabalhar com essa informação conforme nossa necessidade. Caso você queira utilizar a API do Bemean, que retorna os dados no formato JSON, veja mais no post SQL Server 2016 – Como consultar informações de um CEP utilizando a API Bemean e a função JSON_VALUE
Desta vez, vou mostrar como consultar as informações de cidade, estado, bairro, complemento e código IBGE a partir de um cep informado.
Consultando os dados do CEP
Para realizar essa operação, vou utilizar o ótimo serviço da página viacep.com.br para consultar as informações de CEP.
Vou filtrar o CEP de input, para que o mesmo contenha apenas números. Após isso, fazemos fazer uma requisição GET na URL do viacep e depois tratamos o retorno via XQuery.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
CREATE PROCEDURE dbo.stpConsulta_CEP ( @Nr_CEP VARCHAR(20) ) AS BEGIN DECLARE @obj INT, @Url VARCHAR(255), @resposta VARCHAR(8000), @xml XML -- Recupera apenas os números do CEP DECLARE @startingIndex INT = 0 WHILE (1=1) BEGIN SET @startingIndex = PATINDEX('%[^0-9]%', @Nr_CEP) IF (@startingIndex <> 0) SET @Nr_CEP = REPLACE(@Nr_CEP, SUBSTRING(@Nr_CEP, @startingIndex, 1), '') ELSE BREAK END SET @Url = 'http://viacep.com.br/ws/' + @Nr_CEP + '/xml' EXEC sys.sp_OACreate 'MSXML2.ServerXMLHTTP', @obj OUT EXEC sys.sp_OAMethod @obj, 'open', NULL, 'GET', @Url, FALSE EXEC sys.sp_OAMethod @obj, 'send' EXEC sys.sp_OAGetProperty @obj, 'responseText', @resposta OUT EXEC sys.sp_OADestroy @obj SET @xml = @resposta COLLATE SQL_Latin1_General_CP1251_CS_AS SELECT @xml.value('(/xmlcep/cep)[1]', 'varchar(9)') AS CEP, @xml.value('(/xmlcep/logradouro)[1]', 'varchar(200)') AS Logradouro, @xml.value('(/xmlcep/complemento)[1]', 'varchar(200)') AS Complemento, @xml.value('(/xmlcep/bairro)[1]', 'varchar(200)') AS Bairro, @xml.value('(/xmlcep/localidade)[1]', 'varchar(200)') AS Cidade, @xml.value('(/xmlcep/uf)[1]', 'varchar(200)') AS UF, @xml.value('(/xmlcep/ibge)[1]', 'varchar(200)') AS IBGE END |
Após criamos a função, vamos utilizá-la para testar o resultado:
É isso aí!
Obrigado e até a próxima!
Olá Dirceu, tudo bem?
Repliquei esta procedure no meu ambiente e o resultado está retornando vazio para qualquer consulta que eu faço. Sei que o post é um pouco antigo, mas a API continua funcionando (pela web as consultas retornam os dados de endereço corretamente). Consegue validar se para você a procedure continua funcionando ou também retorna NULL como resposta? Assim consigo ter certeza se o problema só está ocorrendo comigo.
Abraços.
Tem algum impactado de performance se eu quiser consumir uma API, se eu usar minha API para validar dados de endereço pelo CEP, o banco comporta bem? posso trabalhar com consumos excessivos para validar algo via API?
Grato!
Paulo,
Obrigado pela visita!
Tem impacto de performance, sim. Cada consulta à API consome em média, uns 480ms. Além disso, a Google, por exemplo, possui uma limitação por IP de 1.000 consultas por dia à API. Após isso, ele mesmo bloqueia seu IP por um determinado período de tempo. Para realizar consultas sem limite, você precisa adquirir uma versão paga da API do Google.
Acredito que a viacep.com.br deve possuir um limite como esse, assim como a maioria das empresas que oferecem esse tipo de serviço.
Uma alternativa mais performática e talvez, barata, é comprar uma base de CEP atualizada diretamente dos Correios. Ao invés de fazer consultas via rede, você poderia simples fazer um select simples nessa base comprada dos Correios.
Dirceu Resende,
Obrigado pelas informações, e eu já fiz esse processo com a base do correios, mas ela esta desatualizada existe bairros novos que em novos cadastros não preenche os campos porque não encontra, preciso atualizar os dados na base, hoje eu procure o CEP na base se não encontro eu busco na API dos correios e atualizo minha base mas tem dados que quando emite notas estão com o endereço desatualizados ou incompletos, então é isso acho melhor comprar comprar uma atualização, e sobre a API paga do google como isso procede? onde tem informações, pensei que só tivesse grátis.
Parabens pelo excelente post. Muito grato
Igo, testei aqui e pra mim está funcionando normalmente. Qual o CEP que você usou e que está dando erro ?
o webservice não esta retornando os valores, esta com o erro HTTP 502