使用来自 MS SQL 的 API 检索表的简单方法

Posted

技术标签:

【中文标题】使用来自 MS SQL 的 API 检索表的简单方法【英文标题】:Simple Way To Retrieve a table using an API from MS SQL 【发布时间】:2020-03-29 15:10:51 【问题描述】:

我是 API 新手,所以请温柔。

我在网上找到了一段代码,我想用它来将数据检索到我的 SQL Server 2019 上的表中。

当我运行它时它什么也不返回,但是如果我将 API URL 粘贴到我的浏览器中它会返回数据。

此服务器似乎没有提供“WSDL”供我使用集成服务。

我怎样才能让它工作? documentation 对于在 SQL 中实现这一点并没有太大帮助。

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',
                 'https://api.nzbplanet.net/api?&t=search&q=wing&apikey=myapikey', --Your Web Service Url (invoked)
                 'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

Select @ResponseText

Exec sp_OADestroy @Object

【问题讨论】:

您为什么要在 SQL Server 中执行此操作,而不是在某种应用程序服务器中?仅仅因为你可以这样做并不意味着你应该 我没有应用服务器。 您必须在某处运行另一台服务器 - 您不是在单个系统上运行整个系统,是吗? 我有其他服务器,但没有应用程序服务器。为什么我不能完全在 SQL 或集成服务中完成? 因为 - 这应该很明显 - 没有本地 tsql 支持这样做。您正在使用陈旧、腐烂、脆弱、容易出错且难以编码/调试的 OLE 自动化程序。参考这个thread中的cmets。 【参考方案1】:

您可以使用 SSIS 脚本组件来检索 API 的负载并将结果写入输出缓冲区。然后将结果写入 SSIS。出于安全考虑,我会避免将数据库直接连接到互联网。

下面是一个例子:

1) 这使用 webclient 类连接到 api。在这种情况下,使用令牌来授权连接 (authToken)。它还使用 TLS 1.2,您的连接可能不需要它

2) Uri 存储在 ssis 中的一个变量中,然后在 scriptcomponent 中指定为只读变量

3) 在这种情况下,DownloadString() 方法会下载一个 json 有效负载。 Newtonsoft.Json 用于反序列化 json。 json 也在下面定义为类,因此可以将其解析为 .NET 对象

4) 输出缓冲区列在脚本组件中定义。我们遍历数据类中的每个值并为每一行设置值。

5) 最后一步就是将此脚本组件源映射到 sql 数据库的 oledb 目标。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Net;
using Newtonsoft.Json;
using System.Collections.Generic;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent


    public override void CreateNewOutputRows()
    
        var uri = Variables.Uri;
        string authToken = Variables.authToken;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

        using (var client = new WebClient())
        
            client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
            client.Headers.Add("authToken", authToken);
            var response = client.DownloadString(uri);
            json parsedResponse = JsonConvert.DeserializeObject<json>(response);
            foreach (var value in parsedResponse.data.values)
            
                Output0Buffer.AddRow();
                Output0Buffer.CreatedBy = value.CreatedBy;
                Output0Buffer.CreatedOn = value.CreatedOn;
            
        
    

public class json

    public status responseStatus  get; set; 
    public data data  get; set; 


public class data

    public List<values> values  get; set; 


public class values


    public string CreatedOn  get; set; 
    public string CreatedBy  get; set; 

【讨论】:

这似乎不太简单。不确定将变量放在哪里以及它如何集成到脚本中。我以前从未这样做过。 这是一个中级解决方案。对于我在这里给出的内容,您将需要进行一些更改和弄清楚。接受这一点肯定会提高你在 SSIS 中的技能。我建议花一些时间查看脚本组件的其他示例,以掌握使用输出缓冲区和变量的窍门。 我花了一个小时左右看这个。我真的很想尝试使用它。如果您知道任何关于某些基础技术的优秀概述视频或网站,那就太好了。 我无法推荐任何视频,但此链接似乎触及了所有关键元素:sqlshack.com/ssis-script-component-overview 这假设您已掌握基础知识并了解同步/异步组件之间的区别等。我建议一次拿一块,学习每个部分 - 可以从创建一个带有虚拟值的行开始,然后从那里开始处理每一块 仍在努力。有一个奇怪的问题,我将 JSON 安装到脚本包中,它看起来不错。然后我保存所有并返回到 ssis 数据流。如果我返回脚本“使用 Newtonsoft.Json;”行显示名称空间不再存在。然而 packages.config 显示它已安装。安装过程中没有错误。

以上是关于使用来自 MS SQL 的 API 检索表的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 2007 中对 ODBC 表导入 sql 查询

混合变量分配和数据检索 - MySQL vs MS SQL Server

MS Access:来自 SQL Server 的只读链接表?

如何在 ms-access VBA 中检索表的 odbc 数据库名称

MS Access SQL:聚合最小值但检索其他字段

如何在 ms 访问中显示来自 sql server 的图像