2010-03-05 71 views
1

似乎SQL Server有相当数量的XML支持。大多数情况下,我已经看到有关在SQL Server中存储XML,查询存储在SQL Server中的XML数据以及将数据公开为XML的信息。通过SQL Server视图暴露基于Web的XML数据

在下列情况下的一个选项:

我想通过SQL Server视图从网站XML数据暴露(这是工作项的RSS视图)。动机是创建新的计算值,然后通过SSRS报告显示数据。

我想使用一个视图,以便数据始终处于活动状态,并避免需要批量ETL。

这可能吗?语法是什么样的?

+0

我会得到这个权利?你想动态地从RSS提要中提取XML并在SQL视图中公开它?不知道是否以及如何可行 - 您是否可以定期将XML下载到SQL Server表中,并从那里公开它? – 2010-03-05 19:57:20

+0

完全正确。但我不想定期下载/插入。 – 2010-03-05 21:48:46

回答

2
using System; 
using System.Data.Sql; 
using Microsoft.SqlServer.Server; 
using System.Collections; 
using System.Data.SqlTypes; 
using System.Diagnostics; 
using System.IO; 
using System.Net; 
using System.Runtime.InteropServices; 

using System.Xml; 

namespace RSSFunctions 
{ 
    public class GetRSSFeedClass 
    { 
     private class RSSRow 
     { 
      public SqlString Title; 
      public SqlString Description; 

      public RSSRow(SqlString Title, SqlString Description) 
      { 
       this.Title = Title; 
       this.Description = Description; 
      } 
     } 

     [SqlFunction(FillRowMethodName = "FillRSSRow")] 
     public static IEnumerable GetRSSFeed(SqlString RSSurl) 
     { 
      ArrayList RSSRowsCollection = new ArrayList(); 
      string url = RSSurl.ToString(); 
      WebRequest req = System.Net.WebRequest.Create(url); 
      WebResponse Res = req.GetResponse(); 

      Stream rssStream = Res.GetResponseStream(); 
      XmlDocument rssDoc = new XmlDocument(); 
      rssDoc.Load(rssStream); 

      XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item"); 

      String Title = ""; 
      String Description = ""; 
      int i = 0; 

      for (i = 0; i <= rssItems.Count - 1; i++) 
      { 
       XmlNode rssDetail = default(XmlNode); 

       Title = ""; 
       rssDetail = rssItems.Item(i).SelectSingleNode("title"); 
       if (rssDetail.Equals(null) == false) 
       { 
        Title = rssDetail.InnerText; 
       } 

       Description = ""; 
       rssDetail = rssItems.Item(i).SelectSingleNode("description"); 
       if (rssDetail.Equals(null) == false) 
       { 
        Description = rssDetail.InnerText; 
       } 

       if (Title.Length > 97) 
       { 
        Title = Title.Substring(0, 97) + "..."; 
       } 

       if (Description.Length > 3997) 
       { 
        Description = Description.Substring(0, 3997) + "..."; 
       } 

       if (!string.IsNullOrEmpty(Title) && !string.IsNullOrEmpty(Description)) 
       { 
        RSSRowsCollection.Add(new RSSRow(new SqlString(Title), new SqlString(Description))); 

       } 
      } 

      return RSSRowsCollection; 
     } 

     public static void FillRSSRow(object obj, out SqlString Title, out SqlString Description) 
     { 
      RSSRow _RSSRow = (RSSRow)obj; 
      Title = _RSSRow.Title; 
      Description = _RSSRow.Description; 
     } 

SSMS

--ALTER DATABASE [dbname] TRUSTWORTHY ON 
--go 

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'RSSData') 
    DROP VIEW RSSData 
go 

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'fncCLRGetRSSFeed') 
    DROP FUNCTION fncCLRGetRSSFeed 
go 

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'CLRRSSAssembly') 
    DROP ASSEMBLY CLRRSSAssembly 
go 
CREATE ASSEMBLY CLRRSSAssembly FROM 'C:\RSSAssembly.dll' 
WITH PERMISSION_SET = EXTERNAL_ACCESS 
GO 

CREATE FUNCTION fncCLRGetRSSFeed(@url nvarchar(100)) 
RETURNS TABLE (
    Title nvarchar(100), 
    [Description] nvarchar(4000) 
) 
AS EXTERNAL NAME CLRRSSAssembly.[RSSFunctions.GetRSSFeedClass].GetRSSFeed 
go 

CREATE VIEW RSSData 
AS 
SELECT * FROM fncCLRGetRSSFeed(N'http://channel9.msdn.com/Feeds/RSS/') 
go 

SELECT * FROM RSSData 
+0

哇 - 谢谢你的所有细节。我会尽快试用 – 2010-03-08 00:24:30

+0

太棒了!我也能够使用XElement来工作,这减少了所需的C#代码的数量。 – 2010-03-08 19:16:07

0

创建一个CLR PROC拉活饲料

+0

我将如何使用它作为视图? – 2010-03-06 23:52:52

相关问题