1

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

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

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

任何帮助将不胜感激!!

谢谢。

4

2 回答 2

4

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

查看以下 MSDN 页面:

  • HttpWebRequest
  • HttpWebResponse
  • xml文档
  • 要转义地址:
    • 如果您使用的是 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 文档,API URI 的格式应类似于以下内容:

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

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

补充说明:

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

Omar Frometa 有一个如何做到这一点的例子。转到此链接 http://www.codeproject.com/Articles/428200/How-to-invoke-a-Web-Service-from-a-Stored-Procedur

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

于 2014-03-27T15:48:40.790 回答