Обрабатывает JSON из API результатов хранимой процедуры

#sql-server #stored-procedures

#sql-сервер #хранимые процедуры

Вопрос:

У меня есть хранимая процедура, которая отправляет запрос API и возвращает JSON с информацией.

 SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Ip_Api_Location]
    @IP varchar(max) 
AS
BEGIN
    DECLARE @Objet AS Int
    DECLARE @Reponse as Varchar(8000)
    DECLARE @url VARCHAR(3000)
    DECLARE @Parametres VARCHAR(3000)
    DECLARE @Erreur int
    DECLARE @MessageErreur varchar(255)
    DECLARE @MessageErreurAvecNumero varchar(255)
    DECLARE @Statut int

    SET @url = 'http://ip-api.com/json/' @IP
    --SET @Parametres = 
  
    exec @Erreur = sp_OACreate 'MSXML2.ServerXMLHttp', @Objet OUT;

    if @Erreur <> 0 
    begin 
        set @MessageErreur = 'sp_OACreate MSXML2.ServerXMLHttp.3.0 failed' 
        goto fin 
    end

    exec @Erreur = sp_OAMethod @Objet, 'open', NULL, 'POST', @url, false

    if @Erreur <> 0 
    begin 
        set @MessageErreur = 'sp_OAMethod Open failed' 
        goto fin 
    end

    exec @Erreur = sp_OAMethod @Objet, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'

    if @Erreur <> 0 
    begin 
        set @MessageErreur = 'sp_OAMethod setRequestHeader failed' 
        goto fin 
    end

    exec @Erreur = sp_OAMethod @Objet, 'send', NULL, @Parametres

    if @Erreur <> 0 
    begin 
        set @MessageErreur = 'sp_OAMethod Send failed' 
        goto fin 
    end

    exec @Erreur = sp_OAGetProperty @Objet, 'status', @Statut OUT

    if @Erreur <> 0 
    begin 
        set @MessageErreur = 'sp_OAGetProperty read status failed' 
        goto fin 
    end

    exec @Erreur = sp_OAMethod @Objet, 'responseText', @Reponse OUTPUT

    if @Erreur <> 0 
    begin 
        set @MessageErreur = 'sp_OAMethod read response failed' 
        goto fin 
    end

   select Responce = @Reponse

   exec sp_OADestroy @Objet
   return

fin:
    print @MessageErreur
    exec sp_OADestroy @Objet

    set @MessageErreurAvecNumero = 'Erreur : '   cast(@Erreur as varchar)   ' - '   @MessageErreur
    Raiserror(@MessageErreurAvecNumero, 16, 1)

    return
END
  

И мой простой SQL-скрипт, который я не знаю, как его написать, чтобы получить информацию из результата JSON.

 BEGIN
DECLARE @json  varchar(MAX)
EXEC @json= Ip_Api_Location '60.8.216.98'Select @json   ---this  print the json
--{"status":"success","country":"China","countryCode":"CN"} 
Select @json --this print "0"
END
  

Поэтому я не могу установить exec в переменную и обработать JSON. Я попытался проанализировать JSON, но мне это не удалось.

Любая помощь?

Заранее спасибо.

Комментарии:

1. Вау! Я не видел goto такого использования с моих ранних базовых дней … думал, что это не одобрялось 🙂

Ответ №1:

Происходит то, что вашей @json переменной присваивается статус возврата, который указывает на успех при сбое.

Проще всего было бы использовать выходной параметр в вашей хранимой процедуре.

Переместите объявление @Reponse переменной в вашей хранимой процедуре в качестве параметра и добавьте ВЫХОДНЫЕ данные, используя NVARCHAR с данными json (МАКС.):

 ALTER PROCEDURE [dbo].[Ip_Api_Location]
    @IP varchar(max)
    ,@Response nvarchar(MAX) OUTPUT
  

Затем, когда вы вызываете с выходным параметром:

 BEGIN
    DECLARE @json VARCHAR(MAX);

    EXEC [Ip_Api_Location] '60.8.216.98', @Response = @json OUTPUT;

    SELECT @json;
END;