Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从存储过程结果API处理JSON_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 从存储过程结果API处理JSON

Sql server 从存储过程结果API处理JSON,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个存储过程,它发布一个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)

我有一个存储过程,它发布一个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
因此,我无法将exec设置为变量并处理JSON。我试图解析JSON,但没有成功

有什么帮助吗


提前感谢。

现在发生的是您的
@json
变量被设置为返回状态,表示失败成功

最简单的方法是在存储过程中使用输出参数

将存储过程中
@response
变量的声明作为参数移动,并添加输出,json数据使用NVARCHAR(MAX):

然后,当您使用输出参数调用时:

BEGIN
    DECLARE @json VARCHAR(MAX);

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

    SELECT @json;
END;

哇!自从我早期的基本生活以来,我从未见过像这样使用
goto
。。。我想这是不受欢迎的:)
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;