SQL2005CLR函数扩展-解析天气服务的实现

我们可以用CLR获取网络服务 来显示到数据库自定函数的结果集中,比如163的天气预报
http://news.163.com/xml/weather.xml他的这个xml结果的日期是不正确的,但这个我们暂不讨论。
从这个xml获取天气的CLR代码如下,用WebClient访问一下就可以了。然后通过Dom对象遍历节点属性返回给结果集。
--------------------------------------------------------------------------------

复制代码 代码如下:

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;
}
}
};

--------------------------------------------------------------------------------
部署这个clr函数的脚本如下
--------------------------------------------------------------------------------

复制代码 代码如下:

drop function dbo. xfn_GetWeather
drop ASSEMBLY TestWeather
go
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

--------------------------------------------------------------------------------
测试函数
--------------------------------------------------------------------------------
select * from dbo. xfn_GetWeather ()

时间: 2024-12-01 05:23:32

SQL2005CLR函数扩展-解析天气服务的实现的相关文章

SQL2005CLR函数扩展-深入环比计算的详解

环比就是本月和上月的差值所占上月值的比例.在复杂的olap计算中我们经常会用到同比环比等概念,要求的上个维度的某个字段的实现语句非常简练,比如ssas的mdx语句类似[维度].CurrentMember.Prevmember就可以了   此类问题还可以延伸到类似进销存的批次计算中,这也要关注其他历史记录来决定当前某条记录的状态. sql语句无法简单实现mdx语句的类似功能,必须得用交叉表关联来对比.这里我们用CLR函数来实现mdx语句的类似语法.在select的时候把得到过的做个缓存就可以了.效

SQL2005CLR函数扩展-繁简转换的实现代码

这个方法比较简单,用Microsoft.VisualBasic命名空间下强大的字符串处理函数就可以了c#代码如下,编译为BigConvertor.dll-------------------------------------------------------------------------------- 复制代码 代码如下: using System; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public

SQL2005CLR函数扩展-繁简转换的实现代码_mssql2005

这个方法比较简单,用Microsoft.VisualBasic命名空间下强大的字符串处理函数就可以了c#代码如下,编译为BigConvertor.dll-------------------------------------------------------------------------------- 复制代码 代码如下: using System; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public

SQL2005CLR函数扩展-深入环比计算的详解_mssql2005

此类问题还可以延伸到类似进销存的批次计算中,这也要关注其他历史记录来决定当前某条记录的状态. sql语句无法简单实现mdx语句的类似功能,必须得用交叉表关联来对比.这里我们用CLR函数来实现mdx语句的类似语法.在select的时候把得到过的做个缓存就可以了.效率应该可以提高不少. clr的代码如下,编译为TestFun.dll,复制到sql服务器的文件目录下.--------------------------------------------------------------------

SQL2005CLR函数扩展-数据导出的实现详解

SQLServer数据导出到excel有很多种方法,比如dts.ssis.还可以用sql语句调用openrowset.我们这里开拓思路,用CLR来生成Excel文件,并且会考虑一些方便操作的细节. 下面我先演示一下我实现的效果,先看测试语句--------------------------------------------------------------------------------exec BulkCopyToXls 'select * from testTable' , 'd:

SQL2005CLR函数扩展 - 关于山寨索引

本文只是一个山寨试验品,思路仅供参考. --------------------------------------------------------------------------------原理介绍:索引建立 目 录结构划分方案也只是很简易的实现了一下,通过unicode把任意连续的两个字符(中文或英文)分为4个字节来做四层目录,把索引的内容对应的主关键字 (主要为了使用sql索引和唯一性)作为文件名,两个字符在索引内容中的位置作为文件后缀来存储.文件本身为0字节,不保存任何信息. 比

SQL2005CLR函数扩展 - 关于山寨索引_mssql2005

本文只是一个山寨试验品,思路仅供参考. --------------------------------------------------------------------------------原理介绍:索引建立 目录结构划分方案也只是很简易的实现了一下,通过unicode把任意连续的两个字符(中文或英文)分为4个字节来做四层目录,把索引的内容对应的主关键字(主要为了使用sql索引和唯一性)作为文件名,两个字符在索引内容中的位置作为文件后缀来存储.文件本身为0字节,不保存任何信息. 比如一

Consul实践之Consul结合nginx构建高可用可扩展的Web服务

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1730439 前文<Consul实践之Consul是什么>讲述了consul是什么,这篇文档是一个Consul实际应用的一个例子,用Consul结合nginx构建高可用可扩展的Web服务.Consul还能做许多其他的事情,可以根据实际需要构思和使用. 方案概述 nginx提供的负载均衡服务同样支持高可用.可扩展的W

C++中的friend函数详细解析_C 语言

为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具体来说:为了使其他类的成员函数直接访问该类的私有变量.即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数. 实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 使用友元函数的优缺点 优点:能够提高效率,表达简单.清晰. 缺点:友元函数破环