Я пытаюсь написать SQL серверную функцию, которая позволит мне передать значение адреса, запросить API Google Places, а затем записать обратно значения, которые возвращаются в таблицу (place_id, name, address).
Я думаю, что единственный способ сделать это - создать табличную функцию. Я сослался на несколько других сообщений здесь, но, похоже, я не могу заставить себя обернуться, переходя от простых выводов в этих сообщениях к приведенному ниже коду, который вызывает и анализирует данные API.
Вот что у меня есть до сих пор :
CREATE FUNCTION dbo.GetPlaceID (@fulladdr nvarchar(1000))
RETURN @gplace TABLE
(
place_id nvarchar(500),
name nvarchar(500),
address nvarchar(1000)
)
AS
BEGIN
DECLARE @Object as Int;
DECLARE @hr int
DECLARE @json AS TABLE (Json_Table nvarchar(max))
DECLARE @addr nvarchar(1000)
DECLARE @url nvarchar(1000)
-- DECLARE @plID nvarchar(500)
SET @addr = @fulladdr
SET @url = 'https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=' + @addr + '&inputtype=textquery&fields=place_id,name,formatted_address&key=<APIKEY>'
EXEC @hr=sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Object OUT;
IF @hr <> 0
EXEC sp_OAGetErrorInfo @Object
EXEC @hr = sp_OAMethod @Object, 'open', NULL, 'get',
@url,
'false'
IF @hr <> 0 EXEC
sp_OAGetErrorInfo @Object
EXEC @hr = sp_OAMethod @Object, 'send'
IF @hr <> 0
EXEC sp_OAGetErrorInfo @Object
INSERT INTO @json (Json_Table)
EXEC sp_OAGetProperty @Object, 'responseText'
-- Parse the JSON string
SELECT *
FROM OPENJSON((SELECT * FROM @json), N'$.candidates')
WITH (
[place_id] nvarchar(max) N'$.place_id',
[name] nvarchar(max) N'$.name',
[address] nvarchar(max) N'$.formatted_address'
)
EXEC sp_OADestroy @Object
RETURN
END
В настоящее время я получаю следующие ошибки:
при вызове INSERT INTO @json (Json_Table)
я получаю сообщение об ошибке
Недопустимое использование побочного оператора 'INSERT EXE C' в функции
в строке SELECT * FROM OPENJSON()
, появляется другая ошибка:
Операторы выбора, включенные в функцию, не могут возвращать данные клиенту