如何从SQL Server存储过程调用Web服务

时间:2013-08-28 11:43:37

标签: sql-server-2008 stored-procedures geocoding sqlclr

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

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

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

任何帮助将不胜感激!

感谢。

2 个答案:

答案 0 :(得分:4)

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

查看以下MSDN页面:

  • HttpWebRequest
  • HttpWebResponse
  • XmlDocument
  • 逃避地址:
    • 如果您使用的是SQL Server 2005,2008或2008 R2,请使用.NET Framework v4.5之前的Uri.EscapeDataString
    • 如果您使用的是SQL Server 2012,2014或更新版本,则可以使用Uri.EscapeDataString,或者,如果服务器已更新至至少.NET Framework v4.5,则可以使用{{3 }}

根据WebUtility.UrlEncode,API URI的格式应与以下内容类似:

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

只需通过HttpWebRequest将这两个变量替换为正确的值,然后调用HttpWebRequest.GetResponse,然后调用HttpWebResponse.GetResponseStream即可。并且忘记调用Close的{​​{1}}和Dispose方法(或在HttpWebResponse块中实例化它)!!

附加说明:

  • 如果尚未完成,则必须启用(一次)" CLR Integration"在服务器级别:Google Geocoding API documentation
  • 不要轻松上路并将数据库设置为using。只需使用密码对程序集进行签名,然后通过指向已签名的DLL在TRUSTWORTHY ON数据库中创建非对称密钥,然后从该非对称密钥创建登录,最后授予该登录master权限。然后,您可以设置程序集UNSAFE ASSEMBLY
  • 请勿将SP_OA *程序用作Enabling CLR Integration。自SQL Server 2005以来,这些OLE自动化程序已被弃用,并且(有希望)有一天会被删除(希望很快)。它们的效率也低于SQLCLR。

答案 1 :(得分: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。