通过 SSMS 调用 REST 服务确实不是一个好主意。
顺便说一句,自从微软创建了存储过程 sp_OAMethod甚至 Red Gate 的 Phil Factor向我们展示了如何使用它,我想试一试。
我想将 OpenStreetMap 中的一些数据直接导入 MSSQL,所以我从这里复制了一个很好的查询,并根据我的意愿对其进行了调整。
在此示例中,我将返回Nelson的所有电影院:
DECLARE @obj AS INT
DECLARE @Uri AS NVARCHAR(4000)
DECLARE @Response AS VARCHAR(8000)
SET @Uri = 'http://overpass-api.de/api/interpreter?data=area[name="Nelson"]->.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp.3.0', @obj OUT
EXEC sp_OAMethod @obj, 'open', NULL, 'GET', @Uri, false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'ResponseText', @Response OUTPUT
SELECT @Response [response]
EXEC sp_OADestroy @obj
很好很简单,我可以在 Postman 和 SSMS 中看到 REST 调用响应:
当我尝试从奥克兰这样的大城市检索所有电影院时,问题就开始了:
DECLARE @obj AS INT
DECLARE @Uri AS NVARCHAR(4000)
DECLARE @Response AS VARCHAR(8000)
SET @Uri = 'http://overpass-api.de/api/interpreter?data=area[name="Auckland"]->.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;'
EXEC sp_OACreate 'MSXML2.ServerXMLHttp.3.0', @obj OUT
EXEC sp_OAMethod @obj, 'open', NULL, 'GET', @Uri, false
EXEC sp_OAMethod @obj, 'send'
EXEC sp_OAGetProperty @obj, 'ResponseText', @Response OUTPUT
SELECT @Response [response]
EXEC sp_OADestroy @obj
REST 调用正在检索更多数据,而变量@Response AS VARCHAR(8000)
无法保存所有数据:
当然,我尝试使用DECLARE @Response AS VARCHAR(MAX)
,但这也无济于事。
不应该VARCHAR(MAX)
保存65,535 个字符和2GB的数据吗?
我应该改用什么?
有没有办法拆分数据并稍后连接?
编辑:我想我越来越近了:我可以以这种方式使用 OPENJSON ,但我仍然不知道如何构造查询......任何帮助将不胜感激