代码之家  ›  专栏  ›  技术社区  ›  Scott Weinstein

通过SQL Server视图公开基于Web的XML数据

  •  1
  • Scott Weinstein  · 技术社区  · 15 年前

    SQL Server似乎有相当多的XML支持。大多数情况下,我都看到过有关在SQL Server中存储XML、查询SQL Server中存储的XML数据以及将数据显示为XML的信息。

    以下场景是否为选项:

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

    我想使用一个视图,这样数据就永远是实时的,并且避免了批量ETL的需要。

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   Scot Hauder    15 年前
    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;
            }
    

    短时短消息

    --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
    
        2
  •  0
  •   Scot Hauder    15 年前

    创建一个clr进程来提取活动源