深圳升蓝软件
数据库开发 .Net技术  |  ASP技术 PHP技术 JSP技术 应用技术类   
Hiblue Software

SQL Server静态页面导出技术(SQL Server Web Assista


March 25,2004
本段文章节选自铁道出版社新出的《用BackOffice建立Intranet/Extranet应用》一书(现已在海淀图书城有售,外地或者
需要送货上门的读者可以到www.wanbook.com.cn或www.e-bookshop.com.cn上在线购买。本书书号为ISBN7113039448)。本
书详尽地讲述了如何使用微软BackOffice系列产品来组建Intranet/Extranet应用。通过它您将掌握NT的安装和设置、使用
IIS建立Web站点、通过ILS建立网络会议系统、用Exchange建立企业的邮件和协作系统、用SQL Server建立Web数据库应
用、用Proxy Server建立同Internet安全可靠的连接、用Media Server建立网络电视台/广播站、用Chart server建立功能
强大的聊天室、用Site Server建立个性化的邮件列表和分析网站的访问情况、用Commerce Server建立B2B或B2C的电子商
务网站。此外本书还对网络的安全性进行了讨论,从而指导您建立一个更为健壮和安全的网络应用。阅读本书之后,您将
发现实现丰富多彩的网络应用原来这样简单……
绝对原创,欢迎转载。但请务必保留以上文字。


最后,我们来介绍导出日期列表页面部分的代码。我们在前面通过IDC技术产生过日期的列表页面,但是在静态页面导出时
采用的方法与其不同。前面通过IDC所产生的页面在浏览器端通过Java来完成对每个日期产生最终页面的工作。这样会造成
产生的页面文件过于庞大。因为对于每个日期,都要包含下面的一段Java代码:
<script>
yue1=yue2;
yue2=4;
if (yue1!=yue2){
tt=0;
if (yue1==0){
document.write('<TABLE BORDER="BORDER" ALIGN="CENTER"><th><tr><h2>1999-4月</h2></tr></th><tr><td>星期日
</td><td>星期一</td><td>星期二</td><td>星期三</td><td>星期四</td><td>星期五</td><td>星期六</td></tr><tr>')
}else{
document.write('</tr></table>')
document.write('<TABLE BORDER="BORDER" ALIGN="CENTER"><th><tr><h2>1999-4月</h2></tr></th><tr><td>星期日
</td><td>星期一</td><td>星期二</td><td>星期三</td><td>星期四</td><td>星期五</td><td>星期六</td></tr><tr>')
}
}
ri=22;
xingqi=5;
if (tt!=0){
if (xingqi<7) {
   document.write('<td><FONT SIZE="+1"><a href="goto.idc?day=1999-04-22"
TARGET="goto"><b>22</b></a></FONT></td>');
}else {
   document.write('<td><FONT SIZE="+1"><a href="goto.idc?day=1999-04-22"
TARGET="goto"><b>22</b></a></FONT></td></tr><tr>');
    }
   }else{
         tt=1;
         for (i=1;i < xingqi;i++){
         document.write('<td></td>');
          }
         document.write('<td><FONT SIZE="+1"><a href="goto.idc?day=1999-04-22"
TARGET="goto"><b>22</b></a></FONT></td>');
         if (xingqi==7){
                       document.write('</tr><tr>');
                      }
         }
</script>
    如果为一年的报纸内容来生产一个页面的话,其大小可能会超过几百KB。这对于局域网来说,算不了什么。这几百KB
数据所带来的延迟用户一般是察觉不到的。因为在局域网上传送这些数据所耗费的时间可能还不到一秒。而对于Internet
用户,就不得不考虑其有限的带宽了。如此之大的页面文件所带来的延迟,恐怕是用户所不能承受的。所以必须缩小此页
面文件的尺寸。我们使用游标和流控制语句在进行静态页面导出的时候,在服务器端完成相应的判断工作。从而只生
产"纯"HTML文件。下面就是实现此功能的代码段:
    declare
@dy int,
    @date varchar(20),
    @yue varchar(2),
    @yue2 varchar(2),
    @ri int,
    @xingqi int,
    @year int,
    @outchar varchar(1600),
    @tt int

create table ##daylist
    (out varchar(1600))

set @yue2='00'
set @tt=0

declare point3 cursor for
SELECT distinct
dy=datepart(dy,riqi),date=left(convert(varchar(40),riqi,20),10),
yue=convert(varchar(2),datepart(mm,riqi)),ri=datepart(dd,riqi),xingqi=datepart(dw,riqi),year=datepart
(yy,riqi)
FROM gaojian
where kanwu = '出版报'
order by year,dy
for read only

open point3
fetch point3 into
        @dy,@date,@yue,@ri,@xingqi,@year
while (@@fetch_status=0)
begin
if @yue<>@yue2
begin
set @tt=0
if @yue2=0
   insert into ##daylist
values('<TABLE BORDER="BORDER" ALIGN="CENTER"><th><tr><h2>'+convert(varchar(4),@year)+
'年'+@yue+'月份</h2></tr></th><tr><td>星期日</td><td>星期一</td><td>星期二</td><td>星期三</td><td>星期四
</td><td>星期五</td><td>星期六</td></tr>')
else
   insert into ##daylist
values('</tr></table><TABLE BORDER="BORDER" ALIGN="CENTER"><th><tr><h2>'+
convert(varchar(4),@year)+'年'+@yue+'月份</h2></tr></th><tr><td>星期日</td><td>星期一</td><td>星期二
</td><td>星期三</td><td>星期四</td><td>星期五</td><td>星期六</td></tr>')
end
if @tt<>0
   if @xingqi < 7
      set @outchar=@outchar+'<td><a href="'+@date+'/index.htm" TARGET="new">'+convert(varchar(2), @ri)
+'</a></td>'
    else
      set @outchar=@outchar+'<td><a href="'+@date+'/index.htm" TARGET="new">'+convert(varchar(2), @ri)
+'</a></td></tr><tr>'
else
      begin
      set @tt=1
      set @outchar=
      case
     when @xingqi=1 then ''
    when @xingqi=2 then '<td></td>'
    when @xingqi=3 then '<td></td><td></td>'
    when @xingqi=4 then '<td></td><td></td><td></td>'
    when @xingqi=5 then '<td></td><td></td><td></td><td></td>'
    when @xingqi=6 then '<td></td><td></td><td></td><td></td><td></td>'
    when @xingqi=7 then '<td></td><td></td><td></td><td></td><td></td><td></td>'
      end
    if @xingqi < 7
      set @outchar=@outchar+'<td><a href="'+@date+'/index.htm" TARGET="new">'+convert(varchar(2), @ri)
+'</a></td>'
    else
      set @outchar=@outchar+'<td><a href="'+@date+'/index.htm" TARGET="new">'+convert(varchar(2), @ri)
+'</a></td></tr><tr>'
     end

insert into ##daylist values(@outchar)

set @yue2=@yue
set @outchar=''

fetch point3 into
        @dy,@date,@yue,@ri,@xingqi,@year
end
close point3
deallocate point3

execute sp_makewebtask
@outputfile='d:testdaylist.htm',
@query='select * from ##daylist',
@templatefile='d:testrili.tml',
@codepage=936
drop table ##daylist
    如果读者十分熟悉Java语言的话,可以看到此段代码同上面的Java代码具有相类似的结构。所不同的是,它是使用SQL
语言中的流控制语句来实现的。在其中我们使用了BEGIN…END、WHILE、IF…ELSE…和CASE等流控制语句。
    流控制语句:
    在SQL语言中,有下列流控制语句:
■    BEGIN…END:将多条SQL语句封装在其间,组成一个语句块。从而使这些语句作为一个整体来执行。
■    IF…ELSE…:其语法结构如下。
IF 布尔表达式
    {sql_statement | statement_block}
[ELSE
    {sql_statement | statement_block}]
当IF后面的布尔表达式的值为真时,执行IF后面的语句或语句块;当布尔表达式的值为假时,执行ELSE后面的语句或语句
块。
■    GOTO语句:其语法结构如下。
定义标号:
label:
程序跳转:
GOTO label
GOTO语句强迫程序跳转到由标号标示之处的语句。
■    WHILE语句:其语法结构如下。
WHILE布尔表达式
    {sql_statement | statement_block}
    [BREAK]
    {sql_statement | statement_block}
    [CONTINUE]
WHILE语句为一个循环语句,只要其后的布尔表达式的值为真,它就会一直执行下去。BREAK语句用于将程序从此循环中跳
出。而CONTINUE用于跳过其后的语句直接进入下一个循环。
■    CASE语句:CASE语句有以下两种语法结构。
简单CASE功能:
CASE 输入表达式
    WHEN 条件表达式 THEN 返回表达式
        [...n]
    [
        ELSE 返回表达式
    ]
END
其执行过程为:将输入表达式的值同各个条件表达式的值进行对比。如果同某个条件表达式的值相同,则返回THEN后的返
回表达式的值。如果没有条件表达式的值同输入表达式的值相同,则返回ELSE后的返回表达式的值。
搜索CASE 功能:
CASE
    WHEN 布尔表达式 THEN返回表达式
        [...n]
    [
        ELSE 返回表达式
    ]
END
与前面的简单CASE功能不同,搜索CASE功能没有输入表达式。其执行过程为:判断WHEN后的布尔表达式是否为真,如果为
真则输出THEN后的返回表达式的值并跳转到END后面的语句;如果为假则对下一个WHEN后的布尔表达式进行判断。如果所有
的WHEN后面的布尔表达式的值都为假,则返回ELSE后面的返回表达式的值。
上面的代码就是用搜索CASE功能的语法结构书写的,如果将其改为用简单CASE功能的语法结构书写,其代码如下:
      case @xingqi
when 1 then ''
    when 2 then '<td></td>'
    when 3 then '<td></td><td></td>'
    when 4 then '<td></td><td></td><td></td>'
    when 5 then '<td></td><td></td><td></td><td></td>'
    when 6 then '<td></td><td></td><td></td><td></td><td></td>'
    when 7 then '<td></td><td></td><td></td><td></td><td></td><td></td>'
   end
在此段代码中,我们还定义了一个临时表##daylist。用来保存程序生成的页面并最后将其输出。在SQL Server中,可以在
程序中建立用来保存临时结果数据的表。我们称之为临时表。临时表会在建立它的对话结束或涉及它的任务停止时自动被
系统删除。当然,我们也可以通过DROP TABLE语句来显示地将其删除。
临时表分为全局和局部两种。全局临时表可以被当前所有的对话使用,而局部临时表只能被建立它的对话使用。由于我们
将在一个扩展存贮过程中使用此表(这样相当于在另一个对话之中访问此表),所以我们选择建立一个全局临时表。全局
临时表和局部临时表的区别在于全局临时表的名字前有两个"#",而局部临时表的名字前只有一个"#"。
    此段代码使用的导出模板文件rili.tml十分简单,其代码如下:
    <html>
<title>出版报</title>
<BODY BACKGROUND="images/WB00703_.gif">
<BODY BGCOLOR="FFFFFF">
<%begindetail%>
<%insert_data_here%>
<%enddetail%>
</TABLE>
</body>
</html>
    最后导出的日期列表页面文件中仅仅包含简单的HTML语句,其尺寸也大大地缩小了。从原来的几百KB缩小到了只有三
十KB左右。在本书配套光盘的SQLServer目录下,你可以找到通过此段代码生成的一个例子文件daylist.htm。

       
Copyright © 2001-2008 Shenzhen Hiblue Software Team All rights reserved