• 工作日志之 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*/


  • 相关阅读:
    case when的使用
    docker 修改容器时间 和时区 的方法 (linux也能用)
    canal笔记
    jenkins集成git,输入分支构建的方法(还没试,用到再看看)
    unittest官网和别人的翻译(有空看看)
    靶机
    CSharp: Reflection in donet 6
    Python: Memento Pattern
    Python: Visitor Pattern
    Python: Command Pattern
  • 原文地址:https://www.cnblogs.com/Areas/p/2277552.html
Copyright © 2020-2023  润新知