从sql server stored-procedure调用api

Ash*_*ore 23 sql-server stored-procedures

从asp.net Web表单调用API非常简单.

C#Asp.Net

WebClient wc = new WebClient();
string urlData = wc.DownloadString("http://xxx.xxx.xx.xx/sssss/getResponse.do?ID=testing");
Run Code Online (Sandbox Code Playgroud)

但我们可以从Sql server存储过程调用API.

如果是,那么我们如何从Sql server存储过程调用API,以及如何获得API响应.

fas*_*ect 30

请参阅链接了解更多详情.

Declare @Object as Int;
Declare @ResponseText as Varchar(8000);

Code Snippet
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get',
                 'http://www.webservicex.com/stockquote.asmx/GetQuote?symbol=MSFT', --Your Web Service Url (invoked)
                 'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

Select @ResponseText

Exec sp_OADestroy @Object
Run Code Online (Sandbox Code Playgroud)


Fra*_*ani 17

我做了很多工作,希望我的努力可以对您有所帮助。

只需将其粘贴到您的SSMS中,然后按F5:

Declare @Object as Int;
DECLARE @hr  int
Declare @json as table(Json_Table nvarchar(max))

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',
                 'http://overpass-api.de/api/interpreter?data=[out:json];area[name=%22Auckland%22]-%3E.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;', --Your Web Service Url (invoked)
                 'false'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'send'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'responseText', @json OUTPUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

INSERT into @json (Json_Table) exec sp_OAGetProperty @Object, 'responseText'
-- select the JSON string
select * from @json
-- Parse the JSON string
SELECT * FROM OPENJSON((select * from @json), N'$.elements')
WITH (   
      [type] nvarchar(max) N'$.type'   ,
      [id]   nvarchar(max) N'$.id',
      [lat]   nvarchar(max) N'$.lat',
      [lon]   nvarchar(max) N'$.lon',
      [amenity]   nvarchar(max) N'$.tags.amenity',
      [name]   nvarchar(max) N'$.tags.name'     
)
EXEC sp_OADestroy @Object
Run Code Online (Sandbox Code Playgroud)

该查询将为您提供3个结果:

1。万一出了什么问题,就赶上错误(不要惊慌,它总是向您显示4000个字符以上的错误,因为NVARCHAR(MAX)只能存储4000个字符

2。将JSON放入字符串中(这就是我们想要的)

3。奖励:解析JSON并将数据很好地存储到表中(这有多酷?)

在此处输入图片说明

  • 感谢您提供的 JSON 解析奖励 (2认同)

Bar*_*ett 6

对着虚空尖叫——只是“不”不要这样做。这是一个愚蠢的想法。

与外部数据源集成是 SSIS 的用途,或者编写一个 dot net 应用程序/服务来查询框并进行 API 调用。

编写 CLR 代码以使 SQL 进程能够调用 Web 服务是一种如果做得不好可能会使 SQL 框瘫痪的事情 - 想象一下将 CLR 函数放在某个地方的视图中 - 后来其他人不知道是什么您已经完成并使用一百万行表加入该视图 - 突然您的 SQL 框正在发出一百万个单独的 webapi 调用。

整个想法是疯狂的。

这种做事是企业 DBA 不信任开发人员的原因。

CLR是那种权力很大,责任很大,以上是对它的滥用。

  • 我还认为它没有很好地分离代码库,并且还使您仍然需要在两个位置设置代码。也许我是老派而且错误,但我认为它应该被分离到 C# Web 服务调用应用程序中,除非这是在最低级别上完成的。 (2认同)

Ger*_*iaz 5

我认为使用这个 CLR 存储过程SQL-APIConsumer会更容易 :

 exec [dbo].[APICaller_POST]
     @URL = 'http://localhost:5000/api/auth/login'
    ,@BodyJson = '{"Username":"gdiaz","Password":"password"}'
Run Code Online (Sandbox Code Playgroud)

它有多个过程,允许您调用需要参数的 API,甚至可以传递多个标头和令牌身份验证。

在此处输入图片说明

在此处输入图片说明