Hola, chicos,
Buen día.

En esta publicación rápida, demostraré una vez más el uso de procedimientos de automatización OLE para consumir información en la Web y llevarla a nuestra base de datos SQL Server, para que podamos trabajar con esta información según necesitemos. Si desea utilizar la API de Bemean, que devuelve datos en formato JSON, vea más en la publicación SQL Server 2016 – Cómo consultar información de un CEP usando la API Bemean y la función JSON_VALUE

En esta ocasión te mostraré cómo consultar información de ciudad, estado, barrio, complemento y código IBGE a partir de un código postal ingresado.

Consultar datos del código postal

Para realizar esta operación utilizaré el gran servicio de la página. viacep.com.br para ver información del código postal.

Filtraré el código postal ingresado para que solo contenga números. Después de eso, realizamos una solicitud GET a la URL de viacep y luego procesamos la devolución a través de XQuery.

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

Después de crear la función, usémosla para probar el resultado:

Busca CEP
búsqueda de código postal

¡Eso es todo!
¡Gracias y hasta la próxima!