2010-03-05 72 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

相關問題