将 Web 服务数据引入 SQL Server

Wil*_*Low 4 xml sql-server ssis import web-service

我需要每天从托管的 Web 服务中检索数据集。我可以在 SSIS 包中检索 XML“列名”。但是我需要以csv格式检索数据集中的所有数据或直接带入SQL Server。(行和列、标题数据和数据集)。

这在 SSIS 上可行吗?或者有更好的方法吗?非常感谢任何输入或建议。

Sol*_*zky 5

这是否需要使用 SSIS 来完成?如果是这样,您几乎可以在脚本任务(C# 或 VB.NET)中执行任何您喜欢的操作。这样您就可以将数据直接带入 SSIS 变量并在整个包中使用。

或者,您可以通过 SQLCLR 执行此操作,在这种情况下,您可以直接从 T-SQL 调用它。这使您可以轻松地将它集成到存储过程、SQL 代理作业等中。您甚至可以在 SSIS 的 SQL 任务中调用它。但是,与在 SSIS 中使用脚本任务相比,使用 SQLCLR 需要更加小心。我在 Stack Overflow 上的几个答案中记录了一些需要考虑的事情:

这些答案中最重要的一点是:

  • 查看以下 MSDN 页面:

  • 要转义 URL/查询字符串:
    • 如果您使用的是 SQL Server 2005、2008 或 2008 R2,请使用Uri.EscapeDataString,因为它在 .NET Framework v4.5 之前可用
    • 如果您使用的是 SQL Server 2012、2014 或更新版本,那么您可以使用 Uri.EscapeDataString 或者,如果服务器已更新到至少 .NET Framework v4.5,那么您也可以使用WebUtility.UrlEncode
  • 如果尚未完成,则必须在服务器级别启用(一次)“CLR 集成”:启用 CLR 集成
  • SQLCLR 是“共享”代码。每个 DB + Owner 组合都有一个应用程序域。因此,所有调用此代码的会话都将在同一个应用程序域中运行。如果同时向同一个 URI 发出多个请求,除前 2 个之外的所有请求都可能“暂停”,因为您受到 ServicePointManager ( ServicePointManager.DefaultConnectionLimit )施加的并发连接限制的约束。默认限制是惊人的2!这意味着,对该 URI 的所有其他请求,虽然已经有 2 个 active/open HttpWebRequests,但将耐心地内联等待。您可以通过设置对象的.ServicePoint.ConnectionLimit属性来增加它HttpWebRequest

  • 您需要将您的程序集标记为WITH PERMISSION_SET = EXTERNAL_ACCESS. 请不要偷懒转身TRUSTWORTHY ON。那是一种不必要的安全风险。确保安全的正确方法是执行以下操作:

    • 签署你的大会
    • [master]数据库中,从程序集的 DLL 创建一个非对称密钥。
    • 此外,在 中[master],从该非对称密钥创建登录
    • 授予您的新登录EXTERNAL ACCESS ASSEMBLY权限
    • 使用PERMISSION_SETof创建您的程序集EXTERNAL_ACCESS而不是 UNSAFE

如果您想沿着 SQLCLR 路径走下去,但又不想弄乱编码等,那么一种选择是获取预构建的函数。在SQL# SQLCLR库(即我写的)有一个功能叫做INET_GetWebPages在免费版中提供)调用一个URL(可以在GET或POST数据传递)和传回的响应(和响应头作为一个单独的XML 字段)。