【问题标题】:SSMS: import data from REST callSSMS:从 REST 调用导入数据
【发布时间】:2019-03-02 02:01:31
【问题描述】:

我想看看是否可以将数据从 REST 调用导入到 MSSQL 到 URL。我想将来将此代码重用于假设的存储过程。这只是想成为一个概念证明。

此 URL 包含一些可用于我的实验的 JSON:

http://api.plos.org/search?q=title:DNA

我用 Postman 检查 URL 是否返回一些 JSON:

都很好。

我现在关注this guide,它告诉我如何构建调用,这是我的代码:

DECLARE @Object AS INT;
DECLARE @ResponseText AS nvarchar(max);

EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'GET','http://api.plos.org/search?q=title:DNA', 'false'
EXEC sp_OAMethod @Object, 'send'
EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
SELECT @ResponseText
EXEC sp_OADestroy @Object

但不幸的是,它返回给我一个NULL 列。

我做错了什么?

有没有人通过 SSMS 进行 REST 调用?

【问题讨论】:

  • 请不要那样做!尤其是 COM 和 Windows 98 附带的古老的 MSXML2 类。要么使用 HttpClient 在 C# 中创建单独的应用程序,要么使用 C# 脚本组件在 SSIS 中创建自定义源。
  • 谢谢@PanagiotisKanavos,请理解这是概念证明。我只想知道为什么我无法检索 JSON。当然是一种不好的方法,没有人应该这样做
  • 顺便说一句,我应该用什么来代替MSXML2
  • @PanagiotisKanavos,我找到了 MSXML2 的替代品,它是 WinHttp.WinHttpRequest.5.1,它直接来自 2018 年
  • 并非如此。问题是您首先使用的是 sp_OAxxx,而没有必要这样做。您仍然需要检查响应的状态码。

标签: json sql-server rest tsql ssms


【解决方案1】:

我建议您使用 SSIS(SQL Server 集成服务)而不是 SSMS。 您可以查看以下链接:

Reference Link 1

Reference Link 2

【讨论】:

  • 谢谢@Mohammad,我不知道我可以通过 SSIS 做到这一点。这绝对是正确的方法。顺便说一句,我不需要实际查询任何 URL,我只是想了解该代码有什么问题。只是一个实验,一个概念证明。
【解决方案2】:

我在第 3 行发现了问题所在:

  1. NVARCHAR(MAX) 只能处理 4000 个字符
  2. VARCHAR(MAX) 只能处理 4000 个字符
  3. VARCHAR(8000) 可以处理 8000 个字符

因此,如果我尝试查询返回较少数据的 URL,一切都很好:

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

但问题仍然存在超过 8000 个字符。

如果您想进一步挖掘follow my next question here

,还有其他问题的空间

【讨论】:

  • 这仍然是一种糟糕的 HTTP 调用方式。第一个问题是sp_OAxxx 本身。你仍然不检查状态码,这意味着你不知道发生了什么。您使用 WRONG 文本类型 - HTTP 响应主要是 UTF8。这意味着如果您在响应中收到任何非美国字符,您将收到错误的文本
  • @PanagiotisKanavos,我在这里写了另一个回复:stackoverflow.com/questions/22067593/…,是的,正如您在该帖子中看到的那样,我可以发现错误。如果 UTF8 不好,如何更改文本类型?我在查询中没有看到管理 UTF8 的内容。谢谢
  • 现在将其与 OP 的问题进行比较。几十条线甚至没有两条线的功能。没有使用 sp_OAxxx 而是引入了 SQLCLR 是有原因的。顺便说一句,如果出现错误,两个答案都会泄漏 NOT 垃圾收集的 COM 对象。 COM 对象是引用计数的。如果您不调用sp_OADestroy,它们将保持活动状态,可能直到服务重新启动。你需要一个TRY .. CATCH
  • 换句话说,过去使用sp_OA 的人在SQLCLR 出现后很快就放弃了它。它会产生很多问题,削弱安全性,没有好处
  • 你说服了我@PanagiotisKanavos,我会尝试使用 SQLCLR。顺便说一句,有趣的事实:WinHTTP.WinHTTPRequest.5.1 无法阅读日语,但 MSXML2.ServerXMLHTTP.6.0 显然可以解析 UTF-8,因为我在我的数据库中看到了这个字符
猜你喜欢
  • 2023-03-27
  • 2017-10-19
  • 2023-02-20
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多