【问题标题】:How to invoke webservice from SQL Server stored procedure如何从 SQL Server 存储过程调用 Web 服务
【发布时间】:2013-08-31 11:15:41
【问题描述】:

我想知道如何使用 SQL Server 存储过程中的 Web 服务。我有一个表格,其中的列指定了用户所在的城市和州。我想将此地址作为参数传递给 Google Geocoding API Web 服务并获取纬度和经度。

我已经在 c# 中成功使用了这个地理编码 api。但是现在,我想在存储过程中使用它。

有人可以建议如何完成这项工作吗?或者请给我任何链接?

任何帮助将不胜感激!

谢谢。

【问题讨论】:

  • 这似乎不是 SQL Server 本身应该处理的工作 - 这是您在应用程序服务器上用 C# 编写的应用程序和/或服务层的工作......

标签: sql-server web-services sql-server-2008 geocoding sqlclr


【解决方案1】:

对于这样的事情,您不需要完整的 Web 服务实现。您可以使用 SQLCLR(SQL Server 的 .NET 集成)将请求提交到 URL,以 XML 格式获取响应(除非您可以找到一个可以工作的 JSON 库设置为UNSAFE ),然后解析该响应。

查看以下 MSDN 页面:

  • HttpWebRequest
  • HttpWebResponse
  • XmlDocument
  • 转义地址:
    • 如果您使用的是 SQL Server 2005、2008 或 2008 R2,请使用 Uri.EscapeDataString,因为它在 .NET Framework v4.5 之前可用
    • 如果您使用的是 SQL Server 2012、2014 或更高版本,则可以使用 Uri.EscapeDataString 或者,如果服务器已更新到至少 .NET Framework v4.5,那么您也可以使用 WebUtility.UrlEncode

根据Google Geocoding API documentation,API URI 的格式应类似于以下:

https://maps.googleapis.com/maps/api/geocode/xml?address={EscapedAddress}&key={API_KEY}

只需通过HttpWebRequest 将这两个变量替换为它们的正确值,然后调用HttpWebRequest.GetResponse,然后调用HttpWebResponse.GetResponseStream不要忘记调用HttpWebResponseCloseDispose方法(或在using块中实例化它)!!

补充说明:

  • 如果尚未完成,您必须在服务器级别启用(一次)“CLR 集成”:Enabling CLR Integration
  • 不要走容易的路,将数据库设置为TRUSTWORTHY ON。只需使用密码对程序集进行签名,然后通过指向您签名的 DLL 在master 数据库中创建一个非对称密钥,然后从该非对称密钥创建一个登录名,最后授予该登录名UNSAFE ASSEMBLY 权限。然后可以设置程序集WITH PERMISSION_SET = EXTERNAL_ACCESS
  • 不要将 SP_OA* 过程用作advocated by user3469363。自 SQL Server 2005 以来,这些 OLE 自动化过程已被弃用,并且(希望)有一天会被删除(希望很快)。与 SQLCLR 相比,它们的效率和安全性也较低。
  • 更多注释可以在我对 DBA.StackExchange 上类似问题的回答中找到:Bringing web service data into SQL server

【讨论】:

    【解决方案2】:

    Omar Frometa 举了一个例子来说明如何做到这一点。去这个链接 http://www.codeproject.com/Articles/428200/How-to-invoke-a-Web-Service-from-a-Stored-Procedur

    总之,使用这些扩展存储过程:SP_OACreate 和 SP_OAMethod 来访问 MSXML2.ServerXMLHttp 等对象。

    【讨论】:

    • 请从链接中添加信息 - 如果该链接失效,此答案将变得无用
    • 通过推荐使用 sp_OA 过程,该链接在发布的第二秒就被证明是无用的。 SQLCLR 是更强大、更安全的技术,并且是在 SQL Server 中不断发展的技术,而 sp_OA procs 实际上已经过时了。
    • @user3469363 - 您好,感谢您抽出宝贵时间回答问题。非常感谢。我已经尝试了链接,但没有任何回应。我不知道它已经过时了,但我现在知道了。感谢 dax 和 orlando。
    • 不要使用老派不太稳定和过时的 COM 对象。随着使用量的增加,您可能会在进程中引入受保护的内存异常终止。而是使用 .NET CLR 或 SSIS 来调用 Web 服务。
    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    相关资源
    最近更新 更多