zoukankan      html  css  js  c++  java
  • 工作日志之 SQL 存储过程返回XML数据集

    新公司,新工作试着用sql 存储过程写调用,所有结果都返回XML数据集,这是第一个成品,贴出来以做留念.

     1-- =============================================
     2-- Author:        <tanke>
     3-- Create date: <2007-4-17>
     4-- Description:    <统计访问量和综合浏览量>
     5-- exec sp_sys_Master '<?xml version="1.0" encoding="unicode" ?><report action="3" gid="-774702857" etime="2007-4-15" stime="2007-4-10" />'
     6-- =============================================
     7ALTER PROCEDURE [dbo].[SP_GetData_BrowseVisit]
     8(
     9@hDoc int
    10)
    11as
    12Begin
    13    -- 参数定义
    14    declare @stime datetime,@etime datetime,@type nvarchar(30),@gid int
    15    declare @tmptab table(cid int,timeid int,the_date datetime,asc_code int)
    16    -- 写入临时表视图
    17    INSERT INTO @tmptab(cid,timeid,the_date,asc_code)
    18    SELECT c.id,b.id, b.the_date,c.asc_code
    19    FROM dbo.Fact_PageAccess AS a,dbo.Dim_Date AS b,dbo.Dim_Company AS c
    20    WHERE a.timeid = b.id AND a.cid = c.id
    21
    22    /**//* 生成返回 */
    23    SELECT  @stime=stime,@etime=etime,@gid=gid from openxml(@hDoc,'//report',1WITH (stime datetime,etime datetime,gid int)
    24    -- 查询
    25    SELECT 1 AS tag,null AS parent,'accountsum/browsesum' as [report!1!type],@gid as [report!1!gid],convert(varchar(30),@stime,111as [report!1!stime],convert(varchar(30),@etime,111as [report!1!etime],null as [detail!2!date],null as [detail!2!count],null as [detail!2!bcount]
    26    UNION ALL
    27    select 2,1,null,null,null,null,the_date, COUNT(*AS count,
    28    (SELECT COUNT(*AS bcount FROM dbo.Fact_SiteAccess AS a WHERE (a.timeid = t.timeid AND a.cid=t.cid)) AS bcount 
    29    FROM @tmptab t WHERE asc_code=@gid AND (DATEDIFF(d, @etime, the_date) <= 0AND (DATEDIFF(d, @stime, the_date) >= 0)
    30    GROUP BY the_date,t.timeid,t.cid
    31    FOR XML EXPLICIT
    32End
    33/**//*
    34-- 返回结果
    35<xmldata>
    36  <report type="accountsum/browsesum" stime="2006-12-01" etime="2006-12-04">
    37    <detail date="2006-12-01" count="" bcount=""/>
    38    <detail date="2006-12-01" count="" bcount=""/>
    39    <detail date="2006-12-01" count="" bcount=""/>
    40  </report>
    41</xmldata>
    42
    43<xmldata>
    44  <action id="2" />
    45  <query gid="-774702857" stime="2007-04-11" etime="2007-04-11"/>
    46</xmldata>
    47*/


    经过一番改进后,收获还是挺多的.

     26-- =============================================
     27-- Author:        <tanke>
     28-- Create date: <2007-4-17>
     29-- Description:    <统计访问量和综合浏览量>
     30-- exec sp_sys_Master '<xmldata><action id="3" /><query gid="-774702857" etime="2007-4-15" stime="2007-4-10" /></xmldata>'
     31-- =============================================
     32ALTER PROCEDURE [dbo].[SP_GetData_BrowseVisit]
     33(
     34@hDoc int
     35)
     36as
     37BEGIN    
     38    -- 消除多余的网络流量
     39    SET NOCOUNT ON
     40    
     41    -- 参数定义    
     42    DECLARE @SQL nvarchar(4000),@stime nvarchar(10),@etime nvarchar(10),@type nvarchar(30),@gid bigint,@sid int,@eid int,@cid int,@s int,@e int,@month nvarchar(2),@part int,@websiteid int;
     43    -- 条件参数
     44    DECLARE @frmurlid int,@frm nvarchar(30),@frmtypeid int,@frmtype nvarchar(30),@areaid int,@area nvarchar(30),@networkid int,@network nvarchar(30),@shourid int,@ehourid int,@keyid int,@keyname nvarchar(30)
     45    -- 临时表
     46    DECLARE @tmptable TABLE([id] [bigint],    [cid] [int],[sid] [int],[websiteid] int,[pageid] [bigint],    [timeid] [int],    [intime] [smalldatetime] ,[outtime] [smalldatetime] ,[spantime] [int],[pagevalue] [int],[pvalue] [int] ,[vorder] [int] ,[Tag] [int],areaid int,networkid int,frmurlid int,frmtypeid int,keyid int,hourid int)
     47    
     48    -- 生成返回
     49    SELECT @stime=stime,@etime=etime,@gid=gid,@frm=isnull(frm,''),@frmtype=frmtype,@area=area,@network=network,@shourid=isnull(shourid,0),@ehourid=isnull(ehourid,0),@keyname=isnull(keyname,'未知'from openxml(@hDoc,'//query',1WITH (stime nvarchar(10),etime nvarchar(10),gid bigint,frm nvarchar(30),frmtype nvarchar(30),area nvarchar(30),network nvarchar(30),shourid int,ehourid int,keyname nvarchar(30));
     50    
     51    -- 查询条件 --
     52    -- 公司ID和站点ID
     53    SELECT @cid=cid,@websiteid=id FROM dbo.Dim_WebSite WHERE asc_code=@gid;
     54    -- 开始时间
     55    SELECT @sid=id FROM dbo.Dim_Date WHERE the_date=@stime
     56    -- 结束时间
     57    SELECT @eid=id FROM dbo.Dim_Date WHERE the_date=@etime
     58    -- 平台来源 
     59    SELECT @frmurlid=id FROM Dim_ComeFrom WHERE [name]=@frm
     60    -- 来源定义
     61    SELECT @frmtypeid=id FROM Dim_ComeFromType WHERE frmtype=@frmtype
     62    -- 访客所在地域 (省份或城市)
     63    SELECT @areaid=id FROM Dim_Area WHERE city=@area OR province=@area
     64    -- 网络提供商
     65    SELECT @networkid=id FROM dim_network WHERE network=@network
     66    -- 时间段(开始/结束)
     67    if @shourid>0
     68        SELECT @shourid=@shourid+1
     69    if @ehourid>0    
     70        SELECT @ehourid=@ehourid+1
     71    -- 关键字
     72    SELECT    @keyid=id FROM Dim_KeyWord WHERE keywordname=@keyname
     73        select @part=@cid/200+1    -------查找分区
     74    
     75    set @s=cast(substring(@stime,6,2as int)
     76    set @e=cast(substring(@etime,6,2as int)
     77    if @s=@e
     78        begin
     79            if @s<10
     80                set @month='0'+cast(@s as nvarchar(1))
     81            else
     82                set @month=cast(@s as nvarchar(2))
     83            set @SQL='SELECT a.*,b.areaid,b.networkid,b.frmurlid,b.frmtypeid,b.keyid,b.hourid FROM Fact_PageAccess_'+@month+' a'+
     84                 ' inner join Fact_SiteAccess_'+@month+' b on a.sid=b.sid'+
     85                 ' WHERE  a.timeid>='+cast(@sid as nvarchar(10))+' AND a.timeid<='+cast(@eid as nvarchar(10))+
     86                 ' and a.websiteid='+cast(@websiteid as nvarchar(10))+
     87                 ' AND $PARTITION.[CidRangePFN](a.cid)='+cast(@part as nvarchar(3))+
     88                 ' AND $PARTITION.[CidRangePFN](b.cid)='+cast(@part as nvarchar(3))
     89        end
     90    else
     91        begin
     92            set @SQL='select * from ('
     93            while @s<@e+1
     94                begin
     95                    if @s<10
     96                        set @month='0'+cast(@s as nvarchar(1))
     97                    else
     98                        set @month=cast(@s as nvarchar(2))
     99                    set @SQL=@SQL+ '
    100                                SELECT a.*,b.areaid,b.networkid,b.frmurlid,b.frmtypeid,b.keyid,b.hourid from Fact_PageAccess_'+@month+' a'+
    101                                ' inner join Fact_SiteAccess_'+@month+' b on a.sid=b.sid'+
    102                                ' WHERE  a.timeid>='+cast(@sid as nvarchar(10))+' AND a.timeid<='+cast(@eid as nvarchar(10))+
    103                                ' and a.websiteid='+cast(@websiteid as nvarchar(10))+
    104                                ' AND $PARTITION.[CidRangePFN](a.cid)='+cast(@part as nvarchar(3))+
    105                                ' AND $PARTITION.[CidRangePFN](b.cid)='+cast(@part as nvarchar(3))
    106                if @s<@e
    107                    set @SQL=@SQL+' UNION ALL '
    108                else
    109                    set @SQL=@SQL+' ) z where 1=1'
    110                set @s=@s+1
    111                end
    112        END
    113        
    114    if @frmurlid>0
    115        set @SQL=@SQL+' and frmurlid='+cast(@frmurlid as nvarchar(10))    
    116    if @networkid>0
    117        set @SQL=@SQL+' and networkid='+cast(@networkid as nvarchar(10))
    118    if @areaid>0
    119        set @SQL=@SQL+' and areaid='+cast(@areaid as nvarchar(10))
    120    if @keyid>0
    121        set @SQL=@SQL+' and keyid='+cast(@keyid as nvarchar(10))    
    122    if @frmtypeid>0
    123        set @SQL=@SQL+' and frmtypeid='+cast(@frmtypeid as nvarchar(10))
    124    if @shourid>0
    125        set @SQL=@SQL+' and hourid>='+cast(@shourid as nvarchar(10))
    126    if @ehourid>0
    127        set @SQL=@SQL+' and hourid<='+cast(@ehourid as nvarchar(10))
    128        
    129    PRINT @SQL
    130    INSERT INTO @tmptable
    131    EXEC(@SQL)
    132    
    133    SELECT 
    134        1 AS tag,
    135        null AS parent,
    136        'accountsum/browsesum' AS [report!1!type],
    137        @stime AS [report!1!stime],
    138        @etime AS [report!1!etime],
    139        null AS [detail!2!date],
    140        null AS [detail!2!count],
    141        null AS [detail!2!bcount]
    142    UNION ALL
    143    SELECT 
    144        2,
    145        1,
    146        null,
    147        null,
    148        null,
    149        b.the_date,
    150        COUNT(DISTINCT a.sid) count
    151        COUNT(*) bcount
    152    FROM @tmptable a
    153    INNER JOIN dbo.Dim_Date b ON b.id=a.timeid
    154    GROUP BY b.the_date
    155    FOR XML EXPLICIT,root('xmldata'),type
    156End
    157/*
    158-- 返回结果
    159<xmldata>
    160  <report type="accountsum/browsesum" stime="2006-12-01" etime="2006-12-04">
    161    <detail date="2006-12-01" count="" bcount=""/>
    162    <detail date="2006-12-01" count="" bcount=""/>
    163    <detail date="2006-12-01" count="" bcount=""/>
    164  </report>
    165</xmldata>
    166*/


  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/Areas/p/2277552.html
Copyright © 2011-2022 走看看