本段文章節(jié)選自鐵道出版社新出的《用BackOffice建立Intranet/Extranet應(yīng)用》一書(現(xiàn)已在各書店有售。如海淀圖書城、西單圖書大廈等。外地或者需要送貨上門的讀者可以到www.wanbook.com.cn或www.e-bookshop.com.cn上在線購(gòu)買。本書書號(hào)為ISBN7113039448)。本書詳盡地講述了如何使用微軟BackOffice系列產(chǎn)品來(lái)組建Intranet/Extranet應(yīng)用。通過它您將掌握NT的安裝和設(shè)置、使用IIS建立Web站點(diǎn)、通過ILS建立網(wǎng)絡(luò)會(huì)議系統(tǒng)、用Exchange建立企業(yè)的郵件和協(xié)作系統(tǒng)、用SQL Server建立Web數(shù)據(jù)庫(kù)應(yīng)用、用Proxy Server建立同Internet安全可靠的連接、用Media Server建立網(wǎng)絡(luò)電視臺(tái)/廣播站、用Chart server建立功能強(qiáng)大的聊天室、用Site Server建立個(gè)性化的郵件列表和分析網(wǎng)站的訪問情況、用Commerce Server建立B2B或B2C的電子商務(wù)網(wǎng)站。此外本書還對(duì)網(wǎng)絡(luò)的安全性進(jìn)行了討論,從而指導(dǎo)您建立一個(gè)更為健壯和安全的網(wǎng)絡(luò)應(yīng)用。閱讀本書之后,您將發(fā)現(xiàn)實(shí)現(xiàn)豐富多彩的網(wǎng)絡(luò)應(yīng)用原來(lái)這樣簡(jiǎn)單…… 絕對(duì)原創(chuàng),歡迎轉(zhuǎn)載。但請(qǐng)務(wù)必保留以上文字。
6.11.2.通過SQL Server查詢Index Server 如果要通過SQL Server查詢Index Server,須使用OPENQUERY函數(shù)。其語(yǔ)法結(jié)構(gòu)如下。 OPENQUERY(linked_server, 'query') 其中l(wèi)inked_server參數(shù)為連接的名稱。而query參數(shù)為要進(jìn)行的查詢,它將以一個(gè)字符串的形式傳送給OPENQUERY函數(shù)。此函數(shù)返回的將是一個(gè)虛擬表,從而可以讓我們對(duì)其做進(jìn)一步的查詢。 下面的語(yǔ)句查找內(nèi)容包含中SQL這個(gè)單詞的所有文件: SELECT * FROM OpenQuery(FileSystem, 'SELECT Directory, FileName, DocAuthor, Size, Create FROM SCOPE() WHERE CONTAINS( Contents, ''SQL'' ) ' ) 對(duì)于Index Server的查詢,其FROM語(yǔ)句的語(yǔ)法格式于普通的SQL語(yǔ)句是有所區(qū)別的。其語(yǔ)法結(jié)構(gòu)如下: FROM [ Catalog_Name.. ] { SCOPE( [ 'Scope_Arguments' ] ) } 其中的Catalog_Name參數(shù)用于指明要進(jìn)行查詢的索引目錄。由于我們?cè)诙x連接時(shí)只能選擇一個(gè)索引目錄,所以此參數(shù)在此將被省略。而SCOPE函數(shù)用于指明要進(jìn)行查詢的文件所在的目錄。SCOPE函數(shù)的語(yǔ)法結(jié)構(gòu)如下圖所示。 圖6.11.2-1SCOPE函數(shù)語(yǔ)法結(jié)構(gòu)圖 其中DEEP TRAVERSAL OF關(guān)鍵字指明將查詢目錄中所有的文件,包括其子目錄中的所有文件。而SHALLOW TRAVERSAL OF關(guān)鍵字則指明只查詢頂級(jí)目錄中的文件,而不包括子目錄中的那些文件。如果不指明查詢的目錄深度,則默認(rèn)為DEEP TRAVERSAL OF。 physical_path和virtual_directory分別為物理目錄和虛擬目錄。其中各自的含義在圖中已經(jīng)標(biāo)示的非常明白了,在此就不再進(jìn)一步說(shuō)明了。 Index Server共支持50種文件屬性,而可以用來(lái)作為查詢條件或返回結(jié)果的常用文件屬性見下表: 屬性名稱數(shù)據(jù)類型注釋可否用于ORDER BY子句可否用于SELECT語(yǔ)句中 Accessdatetime文件的最后訪問時(shí)間。可可 Characterizationnvarchar或ntext文檔的描述或摘要,由Index Server使用。否可 Createdatetime文件的創(chuàng)建時(shí)間。可可 DirectoryNvarchar文件的物理路徑,不包含文件名。可可 DocAppNamenvarchar創(chuàng)建文件的應(yīng)用程序的名稱。如Microsoft Word 9.0。可可 DocAuthornvarchar文檔的作者。可可 DocCommentsnvarchar關(guān)于文檔的注釋。可可 DocCompanynvarchar寫作文檔的公司的名稱。可可 DocLastAuthornvarchar最近編輯文檔的用戶。可可 DocLastPrinteddatetime文檔的最近一次打印時(shí)間。可否 DocPageCountinteger文檔的頁(yè)數(shù)。可否 DocParaCountinteger文檔的圖形數(shù)量。可否 DocRevNumberinteger文檔的當(dāng)前版本。可可 DocSubjectnvarchar文檔的主題。可可 DocTemplatenvarchar文檔的模板。可可 DocTitlenvarchar文檔的標(biāo)題。可可 DocWordCountinteger文檔的字?jǐn)?shù)。可否 FileIndexDecimal(19,0)文件的唯一標(biāo)識(shí)。可可 FileNamenvarchar文件名。可可 HitCountinteger文件中的命中次數(shù)(單詞匹配查詢)。即文件中有多少個(gè)查詢條件中的單詞。可可 Pathnvarchar文件的物理路徑,包含文件名。可可 Rankinteger行的等級(jí),范圍從 0 到 1000,數(shù)字越大表示越匹配。可可 ShortFileNamenvarchar短文件名(8.3格式)。可可 SizeDecimal(19,0)文件大小,單位是字節(jié)。可可 VPathnvarchar指向文件的完整虛擬路徑,包括文件名。如果有多個(gè)可能的路徑,將選擇最符合查詢的一個(gè)。可可 Writedatetime最近一次寫文件的時(shí)間。可可
可以在Where子句中使用以上各種屬性作為查詢的條件。當(dāng)條件中包含全文檢索條件時(shí),需要使用CONTAINS和FREETEXT語(yǔ)句,其用法同SQL Server的全文檢索相同。要注意的是,在對(duì)Index Server的查詢中,不能使用GROUP BY和HAVING子句。因?yàn)檫@不被Index Server所支持。 此外,在查詢的SELECT子句中,不能使用*來(lái)選擇所有的屬性。*只有在對(duì)視圖進(jìn)行查詢時(shí)才可以使用。視圖實(shí)際上可以理解為從一個(gè)查詢導(dǎo)出的虛擬表。通過對(duì)視圖的查詢,可以實(shí)現(xiàn)對(duì)查詢結(jié)果的再次查詢。視圖一般應(yīng)用于需要經(jīng)常被其他查詢作為FROM子句中的數(shù)據(jù)源時(shí)使用。建立視圖使用CREATE VIEW語(yǔ)句,其語(yǔ)法結(jié)構(gòu)如下: CREATE VIEW view_name [(column ][,...n])] AS select_statement 其中view_name為要建立的視圖的名稱,而AS子句后面的就是建立視圖的查詢語(yǔ)句。而此語(yǔ)句有以下限制:不能包含ORDER BY、COMPUTE和COMPUTE BY等子句;不能包含INTO關(guān)鍵字;不能涉及臨時(shí)表。 而column則用于為視圖中的各個(gè)字段命名。一般只有在這些字段是表達(dá)式或函數(shù)及常數(shù)時(shí)才需要為其命名。 在SQL Server中,也同樣可以使用CREATE VIEW語(yǔ)句來(lái)建立視圖。 下面我們通過一個(gè)例子來(lái)了解對(duì)Index Server查詢的全部過程。 我們將在虛擬目錄\Corpus和C:\temp目錄中查找那些作者在writer表中存在記錄且文檔字?jǐn)?shù)超過5000字的文件。并返回作者的名字、文檔題目以及作者的身份。其查詢語(yǔ)句和具體操作過程如下圖所示。 圖6.11.2-2Index Server查詢過程 其中各個(gè)步驟的解釋如下: 1:查詢被提交到SQL Server,將分布式查詢部分(包含在OPENQUERY函數(shù)之內(nèi)的部分)傳遞給SQL Server分布式查詢處理器。 2:分布式查詢處理器將查詢進(jìn)一步傳遞給OLE DB Provider for Indexing Service(MSIDXS),由MSIDX連接到文件系統(tǒng)。 3:MSIDXS分析查詢語(yǔ)句并向文件索引服務(wù)發(fā)出相應(yīng)的命令。 4:文件索引服務(wù)從一個(gè)結(jié)合了Web虛擬目錄/Corpus和C:\Temp目錄的虛擬表中查找那些符合條件的文件并將其作為一個(gè)行集返回給MSIDX。 5:MSIDXS將行集返回給分布式查詢處理器。 6:分布式查詢處理器將返回的行集作為一個(gè)表同writers表進(jìn)行結(jié)合查詢,并將最終結(jié)果返回給查詢提交者。 在對(duì)Index Server的查詢中,還不能使用QUANTIFIED、COMPARISON、BETWEEN、EXISTS、IN以及NULL等謂詞。因?yàn)檫@些都不被Index Server所支持。但是它支持兩個(gè)SQL Server所不直接支持的兩個(gè)謂詞:MATCHES和ARRAY。我們可以在對(duì)Index Server的查詢語(yǔ)句中使用它們。其含義和語(yǔ)法結(jié)構(gòu)分別如下: MATCHES:用于模式匹配,其作用同Like相近但是功能更為強(qiáng)大。它的語(yǔ)法結(jié)構(gòu)如下:MATCHES (Column_Reference, ' { Grouped_Search_Pattern | Counted_Search_Pattern } ') > 0 其中Column_Reference為指定的文件屬性,其數(shù)據(jù)類型必須同后面的Grouped_Search_Pattern相匹配。 Grouped_Search_Pattern為指定的匹配模式。而Counted_Search_Pattern則用于對(duì)匹配的數(shù)量進(jìn)行限定,可以有三種限定方式: 嚴(yán)格匹配:在查詢的文件屬性中包含指定數(shù)目的滿足匹配條件的字串。 至少匹配:在查詢的文件屬性中包含大于或等于指定數(shù)目的滿足匹配條件的字串。 范圍匹配:在查詢的文件屬性中包含滿足匹配條件的字串?dāng)?shù)目界于n~m之間。 MATCHES可以使用的模式匹配符及其含義見下表: 符號(hào)描述 *包含指定的匹配字符串同時(shí)還包含其他0個(gè)或更多的字符。這同dir命令中使用的*十分類似。如以b開頭,以d結(jié)尾的字符串的匹配條件為b|*d。 ?包含指定的匹配字符串同時(shí)還包含其他0個(gè)或一個(gè)字符。如滿足b|?d匹配條件的字串包括bd、bad和bed等。 +包含指定的匹配字符串同時(shí)還包含其他1個(gè)或更多的字符。如滿足b|+d匹配條件的字串包括bad、bed和bond等。 ( )用于界定模式匹配,表明在其中的是模式匹配字符條件。當(dāng)條件多于一個(gè)時(shí)使用。 { }用于界定匹配數(shù)量,表明在其中的是模式匹配數(shù)量條件。 [ ]用來(lái)在模式條件中指明一個(gè)字符串的范圍。 |一個(gè)轉(zhuǎn)義符,要求在上面的每個(gè)符號(hào)前使用它。從而將其同普通字符區(qū)別開來(lái)。 下面通過幾個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明MATCHES謂詞的使用方法。 查找文件內(nèi)容中出現(xiàn)"SQL"三次的文件: ...WHERE MATCHES (DocText, '|(SQL|)|{3|}' ) > 0 查找文件內(nèi)容中出現(xiàn)"SQL"三次以上的文件: ...WHERE MATCHES (DocText, '|(SQL|)|{3,|}' ) > 0 查找文件內(nèi)容中出現(xiàn)"SQL"三次到十次之間的文件: ...WHERE MATCHES (DocText, '|(Bora|)|{3,10|}' ) > 0 當(dāng)你不能確定作者姓名中包含"Pellow"還是"Pelow"時(shí),可以使用下面的條件語(yǔ)句: ...WHERE MATCHES( DocAuthor, '* Pel|{1,2|}ow' ) > 0 ARRAY:用于在兩個(gè)排列(也稱為矢量)之間通過邏輯運(yùn)算符來(lái)進(jìn)行比較。其語(yǔ)法結(jié)構(gòu)如下: Column_Reference Comparison_Operator [ ALL | SOME ] ARRAY [ Array_Elements ] 其中Column_Reference用于比較的文件屬性,可以是多個(gè)屬性。但是要求其數(shù)據(jù)類型同后面的Array_Elements相匹配。 Comparison_Operator為比較運(yùn)算符,它可以是=、!=(不等于)、>、=>、<、<=。 Array_Elements用于指明用于進(jìn)行比較的排列,其必須用"[]"括起來(lái)。空的排列也是允許的,比如下面的查詢也是合法的。 SELECT foo FROM SCOPE() WHERE bar = ARRAY[] ALL和SOME則用來(lái)指明對(duì)Array_Elements使用不同的比較方式。對(duì)于All,將會(huì)對(duì)左側(cè)排列中的每個(gè)元素同右側(cè)排列中相應(yīng)的元素進(jìn)行比較。比如下面的表達(dá)式對(duì)于ALL,表達(dá)式結(jié)果為假: [1,2,3] > ALL ARRAY [1,2] 而對(duì)于SOME,則只要在左側(cè)排列中有一個(gè)值同右側(cè)排列中所有的值比較復(fù)合條件即可。因此下面的表達(dá)式對(duì)于SOME,其表達(dá)式結(jié)果為真: [1,2,3] > SOME ARRAY [2,1] 因?yàn)樵谧髠?cè)排列中的3,比右側(cè)排列中的2和1都大因此返回值為真。 如果不指明ALL或SOME,將會(huì)按照從左至右的順序?qū)Ρ磉_(dá)式左側(cè)排列中的元素同右側(cè)中相應(yīng)的元素進(jìn)行比較。而一旦兩者不同,將直接返回比較結(jié)果而不再繼續(xù)進(jìn)行其他元素的比較。而如果所有比較的值都相等,則根據(jù)排列的勢(shì)來(lái)決定最后的比較結(jié)果。因此下列表達(dá)式的值都為真。 ARRAY [2,3,4] > ARRAY [1,2] ARRAY [2,3,4] > ARRAY [1,2,3] ARRAY [2,3,4] > ARRAY [1,2,3,4] ARRAY [2,3,4] > ARRAY [1,2,5] ARRAY [2,3,4] > ARRAY [2,3,3] ARRAY [2,3,4] > ARRAY [2,3] ARRAY [2,3,4] < ARRAY [2,3,4,5] ARRAY [2,3,4]!= ARRAY [2,3,4,5] 下面通過幾個(gè)例子來(lái)說(shuō)明ARRAY謂詞的使用方法: 查找所有文件屬性為"存檔"的文件: ...WHERE attrib = ARRAY [ 0X820 ] 查找所有文件屬性為"存檔"或"壓縮"(針對(duì)于NTFS文件系統(tǒng))的文件: ...WHERE attrib = SOME ARRAY [0X820 ] 查找矢量值為[10,15,20]的ActiveX文檔: ...WHERE vectorprop = ARRAY [10, 15, 20]
|