#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;