Blog原文:
http://blog.csdn.net/jinjazz/archive/2009/05/14/4187051.aspx我们可以用CLR获取网络服务 来显示到数据库自定函数的结果集中,比如163的天气预报
http://news.163.com/xml/weather.xml最终效果
select * from dbo.xfn_GetWeather ()
只要你知道如何用WebClient下载数据并分析xml,如何用IEnumerable写表值函数就行了。clr代码using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Collections;
using System.Collections.Generic;
using Microsoft.SqlServer.Server;public partial class UserDefinedFunctions
{
     
    [SqlFunction(TableDefinition = "city nvarchar(100),date nvarchar(100),general nvarchar(100),temperature nvarchar(100),wind nvarchar(100)", Name = "GetWeather", FillRowMethodName = "FillRow")]
    public static IEnumerable GetWeather()
    {
        System.Collections.Generic.List<Item> list = GetData();
        return list;
    }
    public static void FillRow(Object obj, out SqlString city, out SqlString date, out SqlString general, out SqlString temperature, out SqlString wind)
    {
        Item data = (Item)obj;
        city = data.city;
        date = data.date;
        general = data.general;
        temperature = data.temperature;
        wind = data.wind;
    }    class Item
    {
        public string city;
        public string date;
        public string general;
        public string temperature;
        public string wind;
    }
    static System.Collections.Generic.List<Item> GetData()
    {
        System.Collections.Generic.List<Item> ret = new List<Item>();
        //try
        //{            string url = "http://news.163.com/xml/weather.xml";
            System.Net.WebClient wb = new System.Net.WebClient();
            byte[] b = wb.DownloadData(url);
            string data = System.Text.Encoding.Default.GetString(b);
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml(data);            foreach (System.Xml.XmlNode node in doc.ChildNodes[1])
            {
                string city = GetXMLAttrib(node, "name");
                foreach (System.Xml.XmlNode subnode in node.ChildNodes)
                {
                    Item item = new Item();
                    item.city = city;
                    item.date = GetXMLAttrib(subnode, "date");
                    item.general = GetXMLAttrib(subnode, "general");
                    item.temperature = GetXMLAttrib(subnode, "temperature");
                    item.wind = GetXMLAttrib(subnode, "wind");
                    ret.Add(item);
                }
            }        //}
        //catch(Exception ex)
        //{
        //    SqlContext.Pipe.Send(ex.Message);
        //}
        return ret;
    }    static string GetXMLAttrib(System.Xml.XmlNode node, string attrib)
    {
        try
        {
            return node.Attributes[attrib].Value;
        }
        catch
        {
            return string.Empty;
        }
    }
};部署代码CREATE ASSEMBLY TestWeather FROM 'd:\sqlclr\TestWeather.dll' WITH PERMISSION_SET = UnSAFE;
--
go
CREATE FUNCTION dbo.xfn_GetWeather ()   
RETURNS table(city nvarchar(100),date nvarchar(100),general nvarchar(100),temperature nvarchar(100),wind nvarchar(100))
AS EXTERNAL NAME TestWeather.UserDefinedFunctions.GetWeather

解决方案 »

  1.   

    http://news.163.com/xml/weather.xml
    网易这个服务的日期输出错了...但他输出的5月8号应该对应的就是今天。
      

  2.   

    呵呵,前段时间在搞那个google finance 的那个API,想搞一个出来看看实时股票的价格.
    后来装了Windows 7后,发现别人都已经做好了,Desktop Gadget Galley.
    呵呵.
      

  3.   

    厉害啊 
    看了楼住的 让我对CLR建表值函数的理解又加深了
      

  4.   

    [Quote=引用 39 楼 yongandenaiba 的回复:]
    厉害啊 
    看了楼住的 让我对CLR建表值函数的理解又加深了
    ok!