本段文章節選自鐵道出版社新出的《用backoffice建立intranet/extranet應用》一書(現已在海淀圖書城有售)。本書詳盡地講述了如何使用微軟backoffice系列產品來組建intranet/extranet應用。通過它您將掌握nt的安裝和設置、使用iis建立web站點、通過ils建立網絡會議系統、用exchange建立企業的郵件和協作系統、用sql server建立web數據庫應用、用proxy server建立同internet安全可靠的連接、用media server建立網絡電視臺/廣播站、用chart server建立功能強大的聊天室、用site server建立個性化的郵件列表和分析網站的訪問情況、用commerce server建立b2b或b2c的電子商務網站。此外本書還對網絡的安全性進行了討論,從而指導您建立一個更為健壯和安全的網絡應用。閱讀本書之后,您將發現實現豐富多彩的網絡應用原來這樣簡單……
絕對原創,歡迎轉載。但請務必保留以上文字。
使用sql語句來實現靜態頁面導出
    首先,我們來看看要通過靜態頁面導出技術實現哪些功能。我們將要把每天報紙的內容按照同idc應用一樣的格式放到出版報在isp的主頁中相應的目錄之中(比如99年5月8號的報紙內容就要放到1999-05-08目錄之中)。而要想達到這樣的效果就需要導出三類文件:每天刊載版面的列表頁面文件(每天一個)、每個版面的文章列表頁面文件(每天有多少個版面,就有多少個這樣的文件)、每篇文章的內容各為一個頁面文件(每天有多少文章,就有多少個這樣的文件)。
sp_makewebtask存貯過程語法結構和參數含義:
    建立靜態頁面導出任務由sp_makewebtask存貯過程來完成。下面我們來看看其具體的語法結構和參數:
    sp_makewebtask [@outputfile =] 'outputfile', [@query =] 'query'
    [, ][@fixedfont =] fixedfont] 
    [, ][@bold =] bold] 
    [, ][@italic =] italic] 
    [, ][@colheaders =] colheaders] 
    [, ][@lastupdated =] lastupdated] 
    [, ][@htmlheader =] htmlheader] 
    [, ][@username =] username] 
    [, ][@dbname =] dbname] 
    [, ][@templatefile =] 'templatefile'] 
    [, ][@webpagetitle =] 'webpagetitle'] 
    [, ][@resultstitle =] 'resultstitle']
    [
        ][, [@url =] 'url', [@reftext =] 'reftext'] 
        | [, ][@table_urls =] table_urls, [@url_query =] 'url_query']
    ]
    [, ][@whentype =] whentype] 
    [, ][@targetdate =] targetdate]
    [, ][@targettime =] targettime] 
    [, ][@dayflags =] dayflags]
    [, ][@numunits =] numunits] 
    [, ][@unittype =] unittype]
    [, ][@procname =] procname ] 
    [, ][@maketask =] maketask]
    [, ][@rowcnt =] rowcnt] 
    [, ][@tabborder =] tabborder]
    [, ][@singlerow =] singlerow] 
    [, ][@blobfmt =] blobfmt]
    [, ][@nrowsperpage =] n] 
    [, ][@datachg =] table_column_list]
    [, ][@charset =] characterset]
    [, ][@codepage =] codepage]
    下面對sp_makewebtask存貯過程的參數逐個的進行介紹:
■    outputfile:指明存放導出的靜態頁面文件的路徑和文件名。對于產生多個文件的情況(比如在限制了每個頁面的最大記錄數目時),系統會自動地在這些文件名的末尾加上數字。
■    query:要由sp_makewebtask存貯過程來執行的sql語句。其結果數據將用于產生靜態頁面。同idc技術相類似,此參數中也允許存在多個查詢。
■    fixedfont:指明是否使用固定寬度字體(為1時使用,為0時不使用。默認為1)。
■    bold:是否使用加粗字體。(為1時使用,為0時不使用。默認為0)
■    italic是否使用斜體字體。(為1時使用,為0時不使用。默認為0)
■    colheaders:是否顯示字段名(結果數據集合的列標題)。(為1時顯示,為0時不顯示。默認為1)
■    lastupdated:是否在頁面中顯示文件的創立時間。(為1時顯示,為0時不顯示。默認為1)
■    htmlheader:頁面標題的顯示格式。其取值為1~6,對應于html語言的h1~h6。
■    username:指明用來執行sql語句的用戶,默認為連接時的用戶(在本應用實例中默認用戶為editer)。
■    dbname:指明在哪個數據庫上運行sql語句。默認為當前數據庫。
■    templatefile:指明模板文件(同idc技術中的htx文件的作用相類似)的所在路徑和文件名。如果使用了模板文件,其他格式控制參數將不再起作用(比如bold、italic和fixedfont等參數)。
■    webpagetitle:指明頁面文件的標題,等效于html語句中<title> </title>之間的字符。
■    resultstitle:用來指定在頁面中返回結果數據集之前顯示的標題。默認為query results。
■    url:用于指明頁面中包含的超鏈接。必須同reftext參數結合使用。
■    reftext:url參數中超鏈接地址的名稱。也就是html文件中連接地址的文字部分。如下面的例子中的"文章查詢"幾個字。
<a href="search.idc?" >文章查詢</a>
■    table_urls:指明是否使用一個查詢來動態的生成頁面中的超鏈接列表(為1時使用,為0時不使用。默認為0)。如果此參數為1時,則不能同時指定url和reftext參數,且必須同時指定url_query參數。
■    url_query:用來產生超鏈接列表的查詢語句。其返回的第一個字段為鏈接地址,第二個字段為此地址的名稱。
■    whentype:用于指明任務執行的時機。其取值及含義如下:
n    1:系統默認值。指明立即建立任務并執行它建立導出頁面。并在執行之后將任務刪除。
n    2:建立任務,但并不立即執行它。其執行的日期和時間將分別由targetdate和targettime參數(可選參數)來決定。如果不指明targettime參數,任務將在由targetdate指明的那天的凌晨0點執行。
n    3:每周的n天執行任務,其首次執行時間分別由targetdate和targettime參數(可選參數)來決定。而在此之后則由dayflages參數來指明將會在一周中的哪些天執行此任務。
n    4:每n分鐘、小時、天或者周執行一次任務。其首次執行時間分別由targetdate和targettime參數(可選參數)來決定。而時間的間隔分別由numunits和unittype參數來指明。
n    5:由用戶來決定何時執行此任務。此任務會被創建但沒有進行調度。用戶可以通過執行sp_runwebtask來執行此任務。
n    6:指明立即建立任務并執行它建立導出頁面。并在執行之后在分別由targetdate和targettime參數(可選參數)指明的日期和時刻執行。
n    7:同3相類似,但它會在任務建立時立即執行一次,所以不需要targetdate參數。
n    8:同4相類似,但它會在任務建立時立即執行一次,所以不需要targetdate參數。
n    9:同5相類似,但它會在任務建立時立即執行一次。
n    10:在任務建立時立即執行一次,以后則在由datachg參數中指定的數據發生變化時執行。
■    targetdate:指明任務執行的日期(如whentype參數為2、3、4、6時),其格式為yyyymmdd。
■    targettime:指明任務執行的時間,其格式為hhmmss。其默認值為凌晨0點。
■    dayflags:用于指明任務在一周中的哪天執行(如whentype參數為3或7時)。其取值為1、2、4、8、16、32、64分別對應于星期天、星期一、星期二、星期三、星期四、星期五、星期六。如果要指明在每周的多個日子中執行任務,則將它們所代表的值相加即可。比如要想在星期一和星期四執行任務,則此參數等于18(2+16=18)。
■    numunits:同unittype參數一起用于指定任務的執行頻度(如whentype參數為4或8時)。其取值范圍為1~255。
■    unittype:用于指明numunits參數的時間單位。其取值可以分別為1、2、3、4,對應于小時、天、周和分鐘。比如當numunits參數為1,unittype參數為2時,任務將在每兩個小時執行一次。
■    procname:指明所建立的任務的名稱。
■    maketask:指明是否建立一個任務來執行導出靜態頁面的存貯過程。其取值可以分別如下:
0:建立一個不加密的存貯過程,但不創建執行該存貯過程的任務。
1:建立一個加密的存貯過程,并創建執行該存貯過程的任務。
2:建立一個不加密的存貯過程,并創建執行該存貯過程的任務(此值為系統默認值)。
■    rowcnt:指明返回sql語句結果數據集中記錄的最大數目。默認為返回所有的記錄。
■    tabborder:指明是否在頁面中的數據畫出表框線。其取值可以為1(畫線)或0(不畫線),默認值為1。
■    singlerow:指明是否為每個返回的記錄都建立一個頁面文件。其取值可以為1(建立單獨的文件)或0(不為每個記錄單獨建立文件),默認值為0。
■    blobfmt:指明是否將查詢返回的結果集中的ntext和image數據類型的字段獨立的放到一個頁面文件之中并在主頁面文件中加入指向這些文件的超鏈接。此參數的默認為空。其格式如下:
"%n% file=output_filename tplt=template_filename url=url_link_name..."
其中n為ntext或image字段在返回結果中的序號。output_filename為ntext和image字段輸出文件名;template_filename為其模板文件名;url_link_name為主頁面文件中連接到此文件的超鏈接的名字。
■    nrowsperpage:指明每個頁面文件中最多的記錄數目。其默認值為0,即所有的返回結果記錄集都將放在一個頁面文件之中。當查詢所返回的記錄數目多于此參數指定的值時,將會產生其他的頁面文件來放置超出的記錄。而且這些頁面文件之中包含相互的超鏈接地址(第一頁、前一頁、后一頁、最后一頁),可以點擊這些超鏈接來完成在這些頁面之間的跳轉。
■    datachg:用來指明當表中哪些字段變化時,執行此任務來產生新的頁面文件(當whentype參數為10時)。其語法格式如下:
{table= name [column=name]}[,...]
■    charset:指明頁面文件使用的字符集。對于中文,其值應該為'gb2312'。
■    codepage:指明頁面文件使用的代碼頁。對于中文,其值應該為936。
對于各種文字charset和codepage的取值如下(可以通過運行sp_enumcodepages存貯過程來得到下面的列表):
code page   character set                             語種 
708         asmo-708                         阿拉伯字符 (asmo 708)
720         dos-720                           阿拉伯字符 (dos)
28596       iso-8859-6                          阿拉伯字符 (iso)
1256        windows-1256                       阿拉伯字符 (windows)
1257        windows-1257                       波羅的海字符 (windows)
852         ibm852                            中歐字符 (dos)
28592       iso-8859-2                          中歐字符 (iso)
1250        windows-1250                       中歐字符 (windows)
936         gb2312                             簡體中文 (gb2312)
52936       hz-gb-2312                          簡體中文 (hz)
950         big5                                繁體中文 (big5)
866         cp866                               西里爾字符 (dos)
28595       iso-8859-5                           西里爾字符 (iso)
20866       koi8-r                               西里爾字符 (koi8-r)
21866       koi8-ru                              西里爾字符 (koi8-u)
1251        windows-1251                        西里爾字符 (windows)
28597       iso-8859-7                           希臘字符 (iso)
1253        windows-1253                        希臘字符 (windows)
862         dos-862                            希伯來字符 (dos)
38598       iso-8859-8-i                          希伯來字符 (iso-logical)
28598       iso-8859-8                            希伯來字符 (iso-visual)
1255        windows-1255                        希伯來字符 (windows)
50932       _autodetect                           日語 (自動選擇)
51932       euc-jp                               日語 (euc)
932         shift_jis                              日語 (shift-jis)
949         ks_c_5601-1987                        朝鮮語
874         windows-874                           泰語 (windows)
1254        iso-8859-9                             土耳其字符 (windows)
65001       utf-8                                  unicode (utf-8)
1258        windows-1258                          越南字符 (windows)
1252        iso-8859-1                             西歐字符
    同靜態頁面導出相關的還有以下存貯過程:
    sp_runwebtask:用于執行由sp_makewebtask建立的靜態頁面導出任務。其語法結構如下:
    sp_runwebtask [][@procname =] 'procname'] 
    [,][@outputfile =] 'outputfile'
    其中procname參數指明要執行的靜態頁面導出任務的名字,而outputfile則指明任務的輸出文件。比如要運行我們在上面建立的靜態頁面導出任務,就可以通過下面的語句來完成:
    exec sp_runwebtask 'test web page'
    sp_dropwebtask:刪除建立的靜態頁面導出任務。其語法結構如下:
sp_dropwebtask {[@procname =] 'procname' | [,@outputfile =] 'outputfile'}
    其中procname參數指明要刪除的靜態頁面導出任務的名字。而outputfile則指明要刪除的導出文件。如果要刪除我們在上面建立的靜態頁面導出任務,則通過下面的語句來完成:
exec sp_dropwebtask 'test web page', 'd:/test/cbb/ttt.htm'