工作日志之 SQL 存储过程返回XML数据集

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

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

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

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

转载于:https://www.cnblogs.com/tanke/archive/2007/05/08/739217.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值