專利名稱::用以支持用戶定義類型的繼承的系統(tǒng)和方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計算機系統(tǒng)內(nèi)的數(shù)據(jù)存儲,尤其涉及在一數(shù)據(jù)庫系統(tǒng)內(nèi)提供用戶定義類型(UDT)的繼承的系統(tǒng)和方法,在該數(shù)據(jù)庫系統(tǒng)中,UDT是連同關(guān)系數(shù)據(jù)庫引擎和文件系統(tǒng)使用的可擴展性機制,用于通過注冊實現(xiàn)一特定合同的受管類型來擴展數(shù)據(jù)存儲的標(biāo)量類型系統(tǒng)。背景MICROSOFTSQLSERVER是一種綜合性數(shù)據(jù)庫管理平臺,它提供了廣泛的管理和開發(fā)工具、強大的提取、轉(zhuǎn)換及加載(ETL)工具、商業(yè)智能和分析服務(wù)以及其他性能。除其他改進(jìn)之外,MICROSOFTWINDOWS.NET框架公共語言運行庫(CLR)最近被集成到SQLSERVER數(shù)據(jù)庫中。CLR是MICROSOFT.NET框架的中心內(nèi)容,它為所有.NET代碼提供執(zhí)行環(huán)境。因而,在CLR內(nèi)運行的代碼被稱為"受管代碼"。CLR提供程序執(zhí)行所需的各種函數(shù)及服務(wù),包括即時(JIT)編譯、分配和管理存儲器、強制類型安全、異常處理、線程管理和安全。如今,在首次調(diào)用NET例程時,CLR由SQLSERVER加載。在SQLSERVER早先的版本中,數(shù)據(jù)庫程序員在編寫服務(wù)器方代碼時僅限于使用Transact-SQL。Transact-SQL是由國際標(biāo)準(zhǔn)組織(ISO)和美國國家標(biāo)準(zhǔn)化組織(ANSI)定義的結(jié)構(gòu)化查詢語言("SQL")的擴展。使用Transact-SQL,數(shù)據(jù)庫開發(fā)者能夠創(chuàng)建、修改及刪除數(shù)據(jù)庫和表,也能夠插入、檢索、修改及刪除儲存在數(shù)據(jù)庫內(nèi)的數(shù)據(jù)。Transact-SQL是專為直接結(jié)構(gòu)性數(shù)據(jù)訪問和操縱而設(shè)計的。盡管Transact-SQL擅長結(jié)構(gòu)性數(shù)據(jù)訪問和管理,它并不是象VISUALBASIC.NET和C#那樣成熟的編程語言。例如,Transact-SQL不支持?jǐn)?shù)組、集合、對每個循環(huán)、位移位或類。隨著CLR被集成到SQLSERVER數(shù)據(jù)庫中,數(shù)據(jù)庫開發(fā)者能夠完成單用Transact-SQL不可能或很難完成的任務(wù)。VISUALBASIC.NET和Cft都是提供對數(shù)組、結(jié)構(gòu)化異常處理和匯編的完全支持的現(xiàn)代編程語言。開發(fā)者可充分利用CLR集成來編寫具有更復(fù)雜邏輯且更合適使用例如VISUALBASIC.NET和Cft語言的計算任務(wù)代碼。這些編程語言提供面向?qū)ο蟮男阅埽绶庋b、繼承及多態(tài)。相關(guān)的代碼能被容易地組織成類和名字空間。受管代碼比Transact-SQL更適合數(shù)字密集運算和復(fù)雜的執(zhí)行邏輯,且具有對包括字符串處理及正則表達(dá)式的許多復(fù)雜任務(wù)的廣泛支持的特征。使用在.NET框架基類庫(BCL)中找到的功能,數(shù)據(jù)庫開發(fā)者可訪問數(shù)千個預(yù)構(gòu)建的類和例程,它們可從任意地儲存的過程、觸發(fā)器或用戶定義的函數(shù)容易地訪問。受管代碼的另一好處是類型安全。在執(zhí)行受管代碼前,CLR驗證該代碼是安全的。此過程被稱為"驗證"。在驗證中,CLR執(zhí)行若干次核查,以確保該代碼可安全運行。例如,核查該代碼以確保未被寫的存儲器不被讀。CLR還將防止緩沖區(qū)溢出。在編寫受管代碼時,部署單元被稱為程序集(assembly)。程序集被打包成動態(tài)鏈接庫(DLL)。受管DLL程序集可被加載到SQLSERVER中并由其主存。CREATEASSEMBLY語句用來在服務(wù)器中注冊程序集。這里是一個例子CREATEASSEMBLYYukonCLRF匪,C:\MyDBApp\YukonCLR.dl1,在此例中,F(xiàn)ROM子句指明要加載的程序集的路徑名。SQLSERVER傳統(tǒng)上支持"內(nèi)建"標(biāo)量類型,例如整數(shù)、浮點數(shù)、日期、時間及字符串。這些內(nèi)建類型總是伴隨著一組內(nèi)建運算,例如+、_、*、/,以及這些類型上的內(nèi)建函數(shù)。這些類型、運算及函數(shù)在它們是由產(chǎn)品實現(xiàn)并打包的,且用戶不能定義自己的類型的意義上是"內(nèi)建"的。期望諸如SQLSERVER等數(shù)據(jù)庫系統(tǒng)允許用戶擴展數(shù)據(jù)庫系統(tǒng)的類型系統(tǒng),從而用戶能夠創(chuàng)建新的類型,它們在該數(shù)據(jù)庫系統(tǒng)中擔(dān)當(dāng)標(biāo)量類型的角色,但包含更復(fù)雜結(jié)構(gòu)和行為,例如,創(chuàng)建由X和Y坐標(biāo)組成的"Point(點)"類型。在這點上,SQL標(biāo)準(zhǔn)及一些數(shù)據(jù)庫管理系統(tǒng)(DBMS)產(chǎn)品使用了術(shù)語"用戶定義類型"來描述幾種形式的可擴展性類型。例如,SQL-99標(biāo)準(zhǔn)描述了一種"獨特類型",這是可由用戶定義的類型,它有一內(nèi)部表示,該內(nèi)部表示是一現(xiàn)有SQL內(nèi)建數(shù)據(jù)類型的值。"獨特類型"可任選地與現(xiàn)有的SQL內(nèi)建標(biāo)量類型共享比較和算術(shù)運算符、類型轉(zhuǎn)換及合計(列)函數(shù)(例,最大值、最小值、平均值)。該獨特類型可允許對其值定義各種約束。另外,通過經(jīng)用戶定義函數(shù)來定義獨特類型專用的新函數(shù),該獨特類型可展示超越現(xiàn)有標(biāo)量類型的行為。對于類型核查,獨特類型和現(xiàn)有標(biāo)量類型被視作不同類型。獨特類型的主要優(yōu)點是容易定義。如果新類型的內(nèi)部表示只有可用現(xiàn)有內(nèi)建類型描述的單個數(shù)據(jù)成員,且該內(nèi)建類型已實現(xiàn)該新類型所需的大部分行為,那么獨特類型是有吸引力的選擇。用戶不必?fù)?dān)心如何實現(xiàn)管理該類型的盤上存儲所需的行為、構(gòu)造函數(shù)、比較運算符(用于排序和索引),算術(shù)運算符及類型轉(zhuǎn)換運算符。用戶只需選擇需要在該獨特類型上展示底層內(nèi)建類型的哪個功能,并可任選地對各個值添加約束或?qū)υ撔骂愋吞砑痈郊雍瘮?shù)。獨特類型另一優(yōu)點是對內(nèi)建類型可用的所有查詢處理,例如直方圖計算,可容易地用于獨特類型的列。然而,獨特類型的一個缺點是它們不能被容易地用來創(chuàng)建更復(fù)雜的類型。SQL-99標(biāo)準(zhǔn)還描述了一種"結(jié)構(gòu)化類型",這是一種可由用戶定義的類型,且具有它是數(shù)據(jù)成員的集合的內(nèi)部表示,其每個數(shù)據(jù)成員可以是一種不同的SQL內(nèi)建或用戶定義類型。這類似于(:和0++中結(jié)構(gòu)的概念。SQL-99描述了一種用于定義結(jié)構(gòu)化類型的樣式,通過這種樣式,用戶只需按照其內(nèi)部結(jié)構(gòu)來定義類型。系統(tǒng)自動生成其數(shù)據(jù)成員的取值器(accessor)和賦值器(mutator)函數(shù)、構(gòu)造函數(shù)、及管理該類型實例的盤上表示的函數(shù)。SQL中所定義的結(jié)構(gòu)化類型的主要優(yōu)點是(a)容易定義類型的基本行為,及(b)定義更復(fù)雜類型的靈活性。然而,結(jié)構(gòu)化類型的一個顯著缺點是定義類型專用方法的復(fù)雜性,這些方法通常經(jīng)以如C或C++等通用編程語言編寫的外部函數(shù)來定義。為了完整地定義結(jié)構(gòu)化類型,類型的定義者必須跨立在SQL和某種其他的編程語言之間。盡管SQL-99的獨特類型和結(jié)構(gòu)化類型的特征向用戶提供了使他們能擴展SQL數(shù)據(jù)庫的現(xiàn)有標(biāo)量類型系統(tǒng)的某些優(yōu)點,但仍存在對使用戶能通過用戶定義類型來擴展數(shù)據(jù)庫系統(tǒng)的標(biāo)量類型系統(tǒng)的改良系統(tǒng)和方法的需求,這些用戶定義類型擔(dān)當(dāng)標(biāo)量類型的角色,但包含更復(fù)雜的結(jié)構(gòu)和行為。UDT專利申請中所揭示的發(fā)明針對一種允許用戶通過創(chuàng)建用戶定義類型來擴展數(shù)據(jù)庫系統(tǒng)的標(biāo)量類型系統(tǒng)的系統(tǒng)和方法,該用戶定義類型擔(dān)當(dāng)標(biāo)量類型的角色,但包含更復(fù)雜的結(jié)構(gòu)和行為。根據(jù)該發(fā)明,用戶以實現(xiàn)類的高級編程語言編寫程序代碼,該類定義了用戶定義類型的結(jié)構(gòu),及可在該用戶定義類型的實例上調(diào)用的方法。如在其中(及此文中)所使用的,當(dāng)術(shù)語"結(jié)構(gòu)"指用戶定義類型時,它包含實現(xiàn)該類型的字段或?qū)傩越M。在UDT專利申請中每個字段的類型可以是標(biāo)量SQL類型或任何之前定義的用戶定義類型。定義用戶定義類型的類隨即被編譯并向數(shù)據(jù)庫系統(tǒng)注冊。特別地,定義了用戶定義類型的CLR類可被編譯為程序集,該程序集隨即經(jīng)CREATEASSEMBLY數(shù)據(jù)定義語句向數(shù)據(jù)庫系統(tǒng)注冊。注冊該程序集后,用戶可使用CREATETYPE數(shù)據(jù)定義語句在程序集內(nèi)注冊定義用戶定義類型的類。對于該UDT專利申請的發(fā)明,數(shù)據(jù)庫系統(tǒng)實施一種特定合同,即類必須實現(xiàn)為使用戶定義類型能夠擔(dān)當(dāng)SQL類型系統(tǒng)中標(biāo)量的角色。如在該申請中(及此文中)所使用的術(shù)語"合同"指在面向?qū)ο缶幊汰h(huán)境中在運行時使用的一種技術(shù),該技術(shù)用于核查要執(zhí)行的代碼是否滿足某些先決條件或要求,從而確保它能正確地執(zhí)行。根據(jù)該發(fā)明,與定義用戶定義類型的類進(jìn)行比較的合同包含若干要求。首先,類必須指定用于在數(shù)據(jù)庫存儲中持久保存用戶定義類型的實例的多個不同格式之一。第二,類必須能夠為該用戶定義類型返回空值。第三,類必須提供一種用于在使用戶定義類型和另一類型(例如字符串類型)間來回轉(zhuǎn)換的方法。一旦滿足了這些要求,數(shù)據(jù)庫系統(tǒng)使用戶定義類型的實例能被創(chuàng)建。在該申請的一實施例中,用戶定義類型可被例示為表中的列值、變量、例程的參數(shù)、或例程的返回值。數(shù)據(jù)庫系統(tǒng)儲存關(guān)于定義用戶定義類型的類的元數(shù)據(jù),以供接下來創(chuàng)建該類型的實例時使用。在本發(fā)明的另一實施例中,使用描述定義該類型的類的元數(shù)據(jù)來執(zhí)行對該用戶定義類型的合同的驗證。用于持久保存用戶定義類型的實例的多個格式包含用戶定義類型的實例根據(jù)數(shù)據(jù)庫系統(tǒng)的本機格式來自動串行化的第一格式,以及用戶定義類型的實例按由用戶所創(chuàng)建的類定義的方式串行化的第二格式。此外,當(dāng)該UDT專利申請的發(fā)明在集成了MICROSOFT.NETCLR的MICROSOFTSQLSERVER內(nèi)實施時,可有用戶定義類型的實例按MICROSOFT.NET框架提供的方法串行化的第三格式。對于UDT專利申請的發(fā)明,數(shù)據(jù)庫系統(tǒng)查詢語言中的表達(dá)式可包括對用戶定義類型實例的一個或多個引用,從而表達(dá)式的求值需要對該用戶定義類型的實例調(diào)用一方法。當(dāng)數(shù)據(jù)庫系統(tǒng)收到這樣一個查詢語言表達(dá)式時,它將該表達(dá)式翻譯成一程序代碼指令序列,當(dāng)這些指令被執(zhí)行時,將對該用戶定義類型的實例調(diào)用所需方法。該數(shù)據(jù)庫系統(tǒng)隨即返回方法調(diào)用的結(jié)果,作為查詢語言表達(dá)式求值的結(jié)果。在一實施例中,在對用戶定義類型的實例調(diào)用方法前,該類型先被反串行化。該發(fā)明的另一個特征是,通過調(diào)用一賦值器方法改變用戶定義類型的實例的值的能力。特別地,定義用戶定義類型的類的作者包括一增變器方法,作為該類的一部分。當(dāng)對該用戶定義類型的實例調(diào)用此賦值器方法,它使該用戶定義類型的值被改變。這個過程可包括將該用戶定義類型的實例反串行化、調(diào)用賦值器方法來改變該實例的反串行化數(shù)據(jù)的值、然后將修改過的用戶定義類型的實例串行化以持久保存改變。根據(jù)該發(fā)明的另一特征,定義戶定義類型的類還可包含一屬性,該屬性指定該用戶定義類型實例串行化的二進(jìn)制表示將按二進(jìn)制排序。這允許對該類型的實例做二進(jìn)制比較,并能對該類型的實例執(zhí)行索引。特別地,對于二進(jìn)制排序的用戶定義類型的實例,當(dāng)數(shù)據(jù)庫系統(tǒng)收到要求對該類型的兩個實例進(jìn)行某種比較的查詢語言表達(dá)式時(例如,>、<或=),這兩個實例的串行化二進(jìn)制表示可用來對該表達(dá)式求值,而無須反串行化任一實例。此外,對于二進(jìn)制排序的用戶定義類型,可在數(shù)據(jù)庫存儲中創(chuàng)建一具有被定義為用戶定義類型的列的表。然后可在該列上創(chuàng)建索引。也可對引用用戶定義類型的查詢語言表達(dá)式創(chuàng)建索引。在這種情形下,首先對該表達(dá)式生成一計算的列,然后對該計算的列創(chuàng)建索引。概述本發(fā)明的各種實施例針對擴展UDT框架以支持繼承。繼承是面向?qū)ο缶幊痰年P(guān)鍵原則之一,也是最現(xiàn)代的類型系統(tǒng)(例如CLR類型系統(tǒng)或XSD類型系統(tǒng))的基本構(gòu)建塊。有了這一擴展,存儲的對象數(shù)據(jù)建模性能將大為改善。它允許從公共語言運行庫(CLR)類型系統(tǒng)到數(shù)據(jù)庫類型系統(tǒng)的自然映射,而無需麻煩而緩慢的對象到關(guān)系映射技術(shù)。在查詢語言中支持涉及繼承的概念大大簡化了繼承的SQL編程建模。盡管在其他數(shù)據(jù)庫產(chǎn)品中已實現(xiàn)了用戶定義類型的繼承,然而本發(fā)明的各種實施例針對UDT繼承解決方案,該方案擁有現(xiàn)有技術(shù)未提供的以下性能中的一項或多項與CLR類型系統(tǒng)的無縫集成。本發(fā)明的若干實施例針對UDT繼承系統(tǒng)與方法,其中基本UDT合同被指定為受管類型的一組必需的自定義屬性和接口,且其中繼承擴展了同一概念,并使用受管類型定義來推進(jìn)對SQL類型系統(tǒng)的繼承的規(guī)范。此解決方案使開發(fā)者能以其選擇的任何遵從CLS的編程語言,包括但不限于C#、C++及VB.NET,來創(chuàng)建繼承類型。對可替換性的完全支持。對于本發(fā)明的若干實施例,如果一地點(site)(變量、參數(shù)、列定義等等)被定義為是一特定的UDT則,該UDT的任一子類型的值可被儲存于該地點。這個可替換性的概念擴展到該類型的所有使用,包括類型轉(zhuǎn)換、轉(zhuǎn)換、賦值及方法調(diào)用,并且以此方式結(jié)果組由客戶端應(yīng)用程序處理。,與索引和杳詢子系統(tǒng)的深度集成。對于本發(fā)明的許多實施例,繼承添加了值的確切運行時類型的概念,該類型可以異于聲明的類型。例如,SQLServer支持對這類信息創(chuàng)建索引,并在基于該值的類型的謂詞中使用該索引。繼承還添加了虛擬行為的概念,虛擬行為可在子類型中被重定義(覆蓋),且此概念可被合并到對一特定UDT函數(shù)的可索引性的計算中,并在類型創(chuàng)建時被驗證。,可杳詢元數(shù)據(jù)及目錄服務(wù)。對于本發(fā)明的各種實施例,類型及其子類型間的關(guān)系在類型創(chuàng)建時記錄于元數(shù)據(jù)中,且可通過可查詢目錄視圖獲得。這使應(yīng)用程序組成了查詢,來確定一特定類型的可替換范圍。在這點上,本發(fā)明的一實施例針對一種具有用于至少一個用戶定義類型的可擴展類型系統(tǒng)的數(shù)據(jù)庫,該用戶定義類型包含描述其結(jié)構(gòu)的信息,以及描述其與另一用戶定義類型(或是子類型,或是超類型/基類型)間的繼承關(guān)系的信息。對于某些實施例,用戶定義類型是用除順序查詢語言(SQL)語句以外的某種語句定義的,例如公共語言運行庫(CLR)語句丄丄++及0#("(:升半音號")語句、和/或visualbasic語句。在任一情況下,若干實施例還針對這樣的系統(tǒng),其中數(shù)據(jù)庫知道兩個用戶定義類型間的繼承關(guān)系(一為子類型,另一為超類型/基類型)對于某些實施例,通過明確地向所述數(shù)據(jù)庫注冊用戶定義類型,來使數(shù)據(jù)庫知道兩個用戶定義類型間的繼承關(guān)系。在這點上,本發(fā)明用于若干實施例的延及全部的方法包11含(a)將類型編譯為程序集;(b)向所述數(shù)據(jù)庫注冊所述程序集;(C)向所述數(shù)據(jù)庫注冊所述程序集的所述類型;及(d)使用所述類型。附圖簡述上述總結(jié)及以下對較佳實施例的詳細(xì)描述在連同附圖一起讀時能更好地被理解。為了闡明本發(fā)明,圖中示出了本發(fā)明的示例性構(gòu)造;然而,本發(fā)明并不限于所揭示的特定方法及手段。附圖中圖1是表示其中可包括本發(fā)明的各個方面的計算機系統(tǒng)的框圖。圖2是表示具有其中可實現(xiàn)本發(fā)明的多種計算設(shè)備的示例性網(wǎng)絡(luò)環(huán)境的框圖。圖3是示出了在受管代碼中例示的用戶定義類型的實例的串行化和反串行化的框圖。圖4是示出SqlUserDefinedType(SQL用戶定義類型)的屬性的非窮盡列表的表格。圖5是偽代碼,示出如果Address是一類型,而USAddress是Address的子類型,那么Address可以是具有類型為Address的列addrcol的表。圖6是示出一客戶機/服務(wù)器反串行化器的偽代碼,它使用被反串行化的值的確切類型來確定其應(yīng)該被反串行化成的CLR類型。圖7是示出了CONVERT(轉(zhuǎn)換)、CAST(類型轉(zhuǎn)換)及TREAT(處理)命令的行為及語義的表。圖8是示出了UDT方法可包含的例程屬性的表。詳細(xì)描述本發(fā)明的主題用符合法定要求的細(xì)節(jié)進(jìn)行描述。然而,該描述本身并不旨在限制本專利的范圍。相反,發(fā)明人構(gòu)想所要求保護的本發(fā)明也可結(jié)合其他現(xiàn)有或未來技術(shù)以其它方式來實現(xiàn),以包括類似于本文所描述的、但有所不同的步驟或元素。并且,盡管可在此文中用術(shù)語"步驟"意味著所用方法的不同方面,然而不應(yīng)將此術(shù)語解釋為暗示此文所揭示的各個步驟間的任何特定的順序,除非明確地描述各個步驟的次序。在下文描述的實施例中,本發(fā)明的上述特征被描述為在MICROSOFTSQLSERVER數(shù)據(jù)庫系統(tǒng)中實現(xiàn)。如上面提及的,SQLSERVER結(jié)合了MICROSOFT.NET公共語言運行庫(CLR),以使受管代碼能被編寫及執(zhí)行,以在SQLSERVER數(shù)據(jù)庫的數(shù)據(jù)存儲上操作。盡管下文描述的實施例運行于此環(huán)境中,然而應(yīng)當(dāng)理解,本發(fā)明絕非僅限于在SQLSERVER產(chǎn)品中實現(xiàn)。相反,本發(fā)明可在支持面向?qū)ο缶幊檀a的實現(xiàn)以在數(shù)據(jù)庫存儲上操作的任一數(shù)據(jù)庫系統(tǒng)中實現(xiàn),例如面向?qū)ο髷?shù)據(jù)庫系統(tǒng)和具有對象關(guān)系擴展的關(guān)系數(shù)據(jù)庫系統(tǒng)。因此應(yīng)當(dāng)理解,本發(fā)明不局限于下文描述的特定實施例,而是旨在覆蓋所附權(quán)利要求書所定義的本發(fā)明精神和范疇之內(nèi)的所有修改。計算機環(huán)境本發(fā)明的許多實施例可在計算機上執(zhí)行。圖1及以下討論旨在提供對可實現(xiàn)本發(fā)明的合適計算機環(huán)境的簡要概括描述。盡管不是必需,但本發(fā)明將在諸如由客戶機工作站或服務(wù)器等計算機執(zhí)行的程序模塊等計算機可執(zhí)行指令的通用環(huán)境中描述。一般而言,程序模塊包括例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等,它們執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。此外,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,本發(fā)明可用其他計算機系統(tǒng)配置來實施,包括手提設(shè)備、多處理器系統(tǒng)、基于微處理器的或可編程消費者電子設(shè)備、網(wǎng)絡(luò)PC、小型機、大型主機等等。本發(fā)明也可在分布式計算環(huán)境中實施,其中任務(wù)由通過通信網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備執(zhí)行。在分布式計算環(huán)境中,程序模塊可位于本地及遠(yuǎn)程記憶存儲設(shè)備中。如圖1中所示,一示例性通用計算系統(tǒng)包括常規(guī)個人計算機20或類似設(shè)備,包括處理單元21、系統(tǒng)存儲器22及系統(tǒng)總線23,該總線將包括系統(tǒng)存儲器在內(nèi)的各種系統(tǒng)組件耦合到處理單元21。系統(tǒng)總線23可以是若干種總線結(jié)構(gòu)之一,包括存儲器總線或存儲器控制器、外設(shè)總線、以及使用多種總線體系結(jié)構(gòu)中的任一種的局部總線。系統(tǒng)存儲器包括只讀存儲器(R0M)24和隨機存取存儲器(RAM)25。包含諸如在啟動時幫助在個人計算機20內(nèi)部各元件間傳遞信息的基本例程的基本輸入/輸出系統(tǒng)26(BI0S)儲存在ROM24中。個人計算機20還可包括用來讀或?qū)懹脖P(未示出)的硬盤驅(qū)動器27、用來讀或?qū)懣梢苿哟疟P29的磁盤驅(qū)動器28、及用來讀或?qū)懼T如CDROM或其他光介質(zhì)等可移動光盤31的光盤驅(qū)動器30。硬盤驅(qū)動器27、磁盤驅(qū)動器28和光盤驅(qū)動器30分別經(jīng)硬盤驅(qū)動器接口32、磁盤驅(qū)動器接口33和光盤驅(qū)動器接口34連到系統(tǒng)總線23。這些驅(qū)動器及其相關(guān)的計算機可讀介質(zhì)為個人計算機20提供計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊及其他數(shù)據(jù)的非易失存儲。盡管本文描述的示例性環(huán)境使用硬盤、可移動磁盤29和可移動光盤31,然而本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,可儲存能由計算機訪問的數(shù)據(jù)的其他類型的計算機可讀介質(zhì),諸如磁帶盒、閃存卡、數(shù)字視頻盤、貝努利盒式磁帶、隨機存取存儲器(RAM)、只讀存儲器(ROM)等等,也可用于該示例性操作環(huán)境中。若干程序模塊可儲存在硬盤、磁盤29、光盤31、ROM24或RAM25上,包括操作系統(tǒng)35、一個或多個應(yīng)用程序36、其他程序模塊37及程序數(shù)據(jù)38。用戶可通過諸如鍵盤40和定位設(shè)備42等輸入設(shè)備來輸入命令和信息到個人計算機20中。其他輸入設(shè)備(未示出)可包括話筒、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等等。這些及其他輸入設(shè)備常通過耦合到系統(tǒng)總線的串行端口接口46連到處理單元21,但也可用其他接口連接,諸如并行端口、游戲端口或通用串行總線(USB)。監(jiān)視器47或其他類型的顯示設(shè)備也通過諸如視頻適配器48等接口連到系統(tǒng)總線23。除監(jiān)視器47之外,個人計算機通常包括諸如揚聲器及打印機等其他外圍輸出設(shè)備(未示出)。圖1的示例性系統(tǒng)還包括主機適配器55、小型計算機系統(tǒng)接口(SCSI)總線56、及連到SCSI總線56的外部存儲設(shè)備62。個人計算機20可用到一個或多個遠(yuǎn)程計算機,諸如遠(yuǎn)程計算機49的邏輯連接在聯(lián)網(wǎng)環(huán)境中運行。遠(yuǎn)程計算機49可以是另一個人計算機、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對等設(shè)備或其他普通網(wǎng)絡(luò)節(jié)點,且通常包括上述相對于個人計算機20所描述的許多或全部元件,盡管在圖1中只示出了記憶存儲設(shè)備50。圖1中描述的邏輯連接包括局域網(wǎng)(LAN)51及廣域網(wǎng)(WAN)52。諸如此類的網(wǎng)絡(luò)環(huán)境常見于辦公室、企業(yè)范圍計算機網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)及因特網(wǎng)。當(dāng)用于LAN網(wǎng)絡(luò)環(huán)境中時,個人計算機20通過網(wǎng)絡(luò)接口或適配器53連到LAN51。當(dāng)用于WAN網(wǎng)絡(luò)環(huán)境中時,個人計算機20通常包括調(diào)制解調(diào)器54或用于通過諸如因特網(wǎng)等廣域網(wǎng)52建立通信的其他裝置。調(diào)制解調(diào)器54可以是內(nèi)置或外置的,它通過串行端口接口46連到系統(tǒng)總線23。在聯(lián)網(wǎng)環(huán)境中,相對于個人計算機20所描述的程序模塊或其部分可儲存在遠(yuǎn)程記憶存儲設(shè)備中。應(yīng)當(dāng)理解,示出的網(wǎng)絡(luò)連接是示例性的,也可使用在計算機間建立通信鏈路的其他裝置。盡管可以想象,本發(fā)明的許多實施例尤其適用于計算機化的環(huán)境,然而本文中沒有任何內(nèi)容旨在將本發(fā)明限于諸如此類的實施例。相反,如本文中所用的術(shù)語"計算機系統(tǒng)"旨在包括能夠存儲并處理信息,和/或能使用所儲存的信息來控制該設(shè)備本身的行為或執(zhí)行的任何及所有設(shè)備,而不論這些設(shè)備本質(zhì)上是電子的、機械的、邏輯的還是虛擬的。網(wǎng)絡(luò)環(huán)境圖2提供了示例性聯(lián)網(wǎng)或分布式計算環(huán)境的示意圖。該分布式計算環(huán)境包含計算對象10a、10b等,及計算對象或設(shè)備110a、110b、100c等等。這些對象可包含程序、方法、數(shù)據(jù)存儲、可編程邏輯等等。這些對象可包含同樣或不同設(shè)備的各部分,諸如PDA、電視機、MP3播放器、個人計算機等等。每個對象都可經(jīng)由通信網(wǎng)絡(luò)14與另一對象通信。此網(wǎng)絡(luò)自身可包含向圖2中的系統(tǒng)提供服務(wù)的計算對象及計算設(shè)備,且其自身可代表多個互連的網(wǎng)絡(luò)。根據(jù)本發(fā)明的一方面,每一對象10a、10b等或110a、110b、110c等可包含一應(yīng)用程序,該應(yīng)用程序可利用API或其他對象、軟件、固件和/或硬件,來請求對用來實現(xiàn)本發(fā)明方法的過程的使用。也應(yīng)當(dāng)理解,諸如110c等對象可主宿于另一計算設(shè)備10a、10b等,或110allOb等中。因此,盡管所描繪的物理環(huán)境將連接的設(shè)備示為計算機,然而諸如此類的圖解純粹是示例性的,且該物理環(huán)境可選地可被描繪或描述為包含諸如PDA、電視機、MP3播放器等的各種數(shù)字設(shè)備、諸如接口、COM對象等軟件對象,等等。有支持分布式計算環(huán)境的各種系統(tǒng)、組件及網(wǎng)絡(luò)配置。例如,計算系統(tǒng)可由有線或無線系統(tǒng)、由本地網(wǎng)絡(luò)或廣泛分布的網(wǎng)絡(luò)連到一起。當(dāng)前,許多網(wǎng)絡(luò)被耦合到因特網(wǎng),它為廣泛分布的計算提供了基礎(chǔ)結(jié)構(gòu)并包含許多不同的網(wǎng)絡(luò)。任一基礎(chǔ)結(jié)構(gòu)可用于附到本發(fā)明的示例性通信。因特網(wǎng)通常指使用TCP/IP協(xié)議套件的網(wǎng)絡(luò)和網(wǎng)關(guān)的集合,這些在計算機網(wǎng)絡(luò)領(lǐng)域內(nèi)是公知的。TCP/IP是"傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議"的縮寫。因特網(wǎng)可被描述為地理上分布的遠(yuǎn)程計算機網(wǎng)絡(luò)的系統(tǒng),這些網(wǎng)絡(luò)由執(zhí)行各種網(wǎng)絡(luò)協(xié)議的計算機互連,這些網(wǎng)絡(luò)協(xié)議允許用戶通過網(wǎng)絡(luò)交互并共享信息。因為諸如此類的廣泛分布的信息共享,諸如因特網(wǎng)等遠(yuǎn)程網(wǎng)絡(luò)迄今一般已進(jìn)化成一開放式系統(tǒng),開發(fā)者可為其設(shè)計軟件應(yīng)用程序,來本質(zhì)上不受限制地執(zhí)行專門的操作或服務(wù)。因而,網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)允許大量的網(wǎng)絡(luò)拓樸,諸如客戶機/服務(wù)器、對等、或混合體系結(jié)構(gòu)。"客戶機"是一個類或組的成員,該類或組使用與其不相關(guān)的另一個類或組的服務(wù)。因而,在計算中,客戶是一進(jìn)程,即概略地說是請求由另一程序所提供的服務(wù)的一組指令或任務(wù)??蛻魴C進(jìn)程無須"了解"關(guān)于其他程序或服務(wù)本身的工作細(xì)節(jié),即可使用所請求的服務(wù)。在客戶機/服務(wù)器體系結(jié)構(gòu)中,尤其是連網(wǎng)系統(tǒng)中,客戶機通常是訪問由另一計算機,如服務(wù)器所提供的共享網(wǎng)絡(luò)資源的計算機。在圖2的例子中,可認(rèn)為計算機110a、110b等是客戶機,而計算機10a、10b等是服務(wù)器,盡管取決于環(huán)境,任何計算機可被認(rèn)為是客戶機、服務(wù)器或兩者。這些計算設(shè)備的任一個可以用包含本發(fā)明的用戶定義類型技術(shù)的方式來處理數(shù)據(jù)。服務(wù)器通常是可通過諸如因特網(wǎng)等遠(yuǎn)程或本地網(wǎng)絡(luò)來訪問的遠(yuǎn)程計算機系統(tǒng)??蛻魴C進(jìn)程可以在第一計算機系統(tǒng)里活動,而服務(wù)器進(jìn)程可以在第二計算機系統(tǒng)里活動,它們通過通信媒介彼此通信,從而提供了分布式功能,并允許多個客戶機利用服務(wù)器的信息搜集能力。依照本發(fā)明所使用的任何軟件對象可遍及多個計算設(shè)備而分布??蛻魴C與服務(wù)器可使用由協(xié)議層提供的功能彼此通信。例如,超文本傳輸協(xié)議(HTTP)是與萬維網(wǎng)(WWW),或稱"Web"聯(lián)合使用的公用協(xié)議。通常,可用諸如互聯(lián)網(wǎng)協(xié)議(IP)地址等計算機網(wǎng)絡(luò)地址,或諸如統(tǒng)一資源定位器(URL)等其他引用,來相互標(biāo)識服務(wù)器或客戶計算機。網(wǎng)絡(luò)地址可視作URL地址??赏ㄟ^任何可用通信媒介提供通信。因此,圖2示出了其中可使用本發(fā)明的示例性連網(wǎng)或分布式環(huán)境,它有一經(jīng)由網(wǎng)絡(luò)/總線與客戶計算機通信的服務(wù)器。依照本發(fā)明,網(wǎng)絡(luò)/總線14可以是LAN、WAN、內(nèi)聯(lián)網(wǎng)、因特網(wǎng)或其他網(wǎng)絡(luò)媒介,它具有若干客戶機或遠(yuǎn)程計算設(shè)備110a、110b、110c、110d、110e等,諸如便攜式計算機、手持式計算機、瘦客戶機、連網(wǎng)裝置、或其他設(shè)備,諸如VCR、TV、烤箱、電燈、加熱器等等。由此,可以構(gòu)想本發(fā)明可應(yīng)用于任何計算設(shè)備,期望結(jié)合該計算設(shè)備在數(shù)據(jù)庫存儲中創(chuàng)建用戶定義類型。例如,在通信網(wǎng)絡(luò)/總線14為因特網(wǎng)的網(wǎng)絡(luò)環(huán)境中,服務(wù)器10a、10b等可以是服務(wù)器,客戶機110a、110b、110c、110d、110e等經(jīng)由諸如HTTP等許多已知協(xié)議的任一種與其通信。服務(wù)器10a、10b等也可擔(dān)當(dāng)客戶機110a、110b、110c、110d、110e等,這可以是分布式計算環(huán)境的特性。通信在適當(dāng)時可以是有線或無線的。客戶機設(shè)備110a、110b、110c、110d、110e等可以經(jīng)由通信網(wǎng)絡(luò)/總線14通信或不通信,且可具有與其相關(guān)聯(lián)的獨立通信。例如,在TV或VCR的情況下,可以有或沒有控制其的連網(wǎng)方面。每個客戶計算機110a、110b、110c、110d、110e等,及服務(wù)器計算機10a、10b等,可配備各種應(yīng)用程序模塊或?qū)ο?35,并配備對各種類型的存儲元件或?qū)ο蟮倪B接或訪問,文件或數(shù)據(jù)流可被在這些存儲元件或?qū)ο笊蟽Υ妫蚩上蜻@些存儲元件或?qū)ο笙螺d、發(fā)送或移動部分文件或數(shù)據(jù)流。任一計算機10a、10b、110a、110b等可負(fù)責(zé)維護與更新數(shù)據(jù)庫、存儲器或其他存儲元件20,以存儲根據(jù)本發(fā)明處理的數(shù)據(jù)。因而,本發(fā)明可在具有客戶計算機110a、110b等以及服務(wù)器計算機10a、10b等的計算機網(wǎng)絡(luò)環(huán)境中使用,客戶計算機可訪問計算機網(wǎng)絡(luò)/總線14并與其交互,服務(wù)器計算機可與客戶計算機110a,110b等、及其他類似設(shè)備及數(shù)據(jù)庫20交互。UDT和受管代碼圖3是示出了用戶定義類型的實例的串行化及反串行化的框圖。如圖所示,通過在存儲器中串行化代表實例的對象,該用戶定義類型的實例在盤上持久存留。當(dāng)應(yīng)用程序產(chǎn)生一包括引用UDT的方法或?qū)嵗闹^詞或表達(dá)式的查詢時,該實例的持久存留的形式被反串行化(也稱作"水合"的過程),且CLR為整個對象分配存儲器以接收其儲存的值。CLR隨即對實現(xiàn)應(yīng)用程序或用戶期望行為的對象調(diào)用適當(dāng)?shù)姆椒?。UDT繼承如本文中所用的,以下術(shù)語應(yīng)當(dāng)具有所表明的涵義基類型給定類型從其繼承的類型,在各種繼承模型中也稱作超類型、超類或真先輩(properancestor)。子類型直接、或通過另一子類型,將當(dāng)前類型作為其基類型的類型。*地點(site):編程語言中具有相關(guān)類型定義的任意上下文。例子包括變量定義、參數(shù)定義、列定義等等。聲明類型地點的"編譯時"類型,例如表中一列的類型,或函數(shù)參數(shù)。*確切類型特定值的"運行時"類型。在強類型的系統(tǒng)中,確切類型必須是聲明類型,或聲明類型的子類型??商鎿Q性地點的屬性,其中子類型的值可"取代"基類型的值。例如,參數(shù)可替換性意味著,如果一函數(shù)被聲明為取一特定類型的參數(shù),應(yīng)當(dāng)可能向該函數(shù)傳遞子類型的值。對于本發(fā)明的各種實施例,UDT是在向SQLServer注冊的程序集中實現(xiàn)的受管類型。UDT可用于大多數(shù)能使用本機類型的上下文中,包括表定義變量和參數(shù)。在遵照UDT合同的UDT中定義的方法、屬性及字段能從T-SQL調(diào)用。對于若干實施例,假設(shè)UDT是具有行為的簡單標(biāo)量。此假設(shè)體現(xiàn)在UDT支持的簡單編程模型及串行化設(shè)計中。例如,文件系統(tǒng)可使用UDT抽象來創(chuàng)建"結(jié)構(gòu)化類型",這些結(jié)構(gòu)化類型不是簡單標(biāo)量,而是具有復(fù)雜結(jié)構(gòu)與行為的類型。下面的偽代碼描述了本發(fā)明的若干實施例的子類型的創(chuàng)建CREATETYPE[類型模式名.]子類型名UNDER[類型模式名.]基類型名EXTERNALNAME程序集名CLR類型名為建立繼承合同,并用于本發(fā)明的若干實施例,UDT作者必須用例如SqlUserDefinedType自定義屬性在類型分層結(jié)構(gòu)中注釋基類型,且該屬性的性質(zhì)指定了應(yīng)用于整個類型家族(類型及其所有子類型)的不變量。圖4中示出了SqlUserDefinedType的屬性的非窮盡列表。然后,在類型注冊時,用戶必須添加"UNDER"子句來指示一必須在其下注冊特定類型的基SQL類型,例如/*創(chuàng)建Address類型,沒有超類型*/createtypeAddressexternalnameMyTypes::Address/*創(chuàng)建其下的USAddress子類型*/createtypeUSAddressunderAddressexternalnameMyTypes::USAddress對于本發(fā)明的若干實施例,基類型名必須以專用模式注冊為有效UDT。此外,CLR類型必須是通過其定義基類型名的CLR類型的直接子類型。該子類型不應(yīng)定義SqlUserDefinedTypeAttribute,而應(yīng)從其父類型繼承該屬性。此外,基類型決不能是二進(jìn)制排序的。類似地,基類型中指定的所有帶外例程屬性(SqlMethodAttribute注解)必須與子類型定義相一致-具體地,基類型中定義的所有可索引方法對于子類型中覆蓋的例程必須仍可索引_并且可從基類型收集此信息,并通過在該子類型的所有例程上枚舉來驗證此信息,作為CREATETYPE核查的一部分。對于本發(fā)明的各種實施例,可按照特征的外部表面區(qū)域及其底層實現(xiàn)來描述UDT繼承的框架。此外,子類型值被認(rèn)為是在列定義中;局部變量和參數(shù)的批量定義、已儲存的過程及函數(shù)中;以及其中結(jié)果列可包含該列所聲明的類型或其任一子類型的值的查詢結(jié)果集中被認(rèn)為是可替換的。對于本發(fā)明的若干實施例,允許子類型的實例被儲存在被聲明為超類型的列中有以下含義(a)對于基類型和子類型,串行化格式應(yīng)當(dāng)是相同的,及(b)父類型的16MaxByteSize(最大字節(jié)大小)值必須足夠大,以允許儲存子類型的實例。在運行時,如果空間不夠,則試圖在基類型的列中儲存子類的值將失敗,因此基類型可被定義為無限來防止此錯誤。對于本發(fā)明的各種實施例,所有的賦值可保持該值的確切類型,且將子類型的值賦給基類型的變量總是會成功,但將聲明類型為基類型的值賦給子類型的變量要求一顯式的轉(zhuǎn)換,僅當(dāng)該值的確切類型可被賦給目標(biāo)類型時,該轉(zhuǎn)換才會成功。例如,如果Address是一類型,且如果USAddress是Address的子類型,那么如圖5中所示,Addresses可以是具有類型為Address的列addrcol的表。在實現(xiàn)本發(fā)明的若干實施例時,關(guān)于兩個類型間的繼承關(guān)系的信息是數(shù)據(jù)庫的標(biāo)量類型系統(tǒng)的頭等部分,且該信息用于確定可賦值性及各值之間的轉(zhuǎn)換。在某些實施例中,稱為ISOF和TREAT的兩個新算子被引入到標(biāo)量類型系統(tǒng)中,這些算子可用于在標(biāo)量表達(dá)式求值過程中對類型謂詞和原地轉(zhuǎn)換建模。為允許正確的語義推理及組合公用運算(諸如查詢的項目列表中的ISOF謂詞和TREAT),TREAT算子在查詢編譯時被轉(zhuǎn)換。作為進(jìn)一步的優(yōu)化,ISOF算子可按照hierarchical—type」d來重寫,以利用可用的任何類型專用索引。當(dāng)碰到UDT表達(dá)式時,UDT表達(dá)式編譯過程被修改,來說明該分派的本質(zhì)(虛擬的還是靜態(tài)的),并消除基于該方法的完整簽名的方法的歧義,包括參數(shù)類型。此信息從外部編譯過程傳入,并被用于方法定位。一旦找到該方法,就使用適當(dāng)?shù)腎L指令來調(diào)用靜態(tài)分派或虛擬方法。然后在運行時,UDT反串行化代碼使用該值的確切類型來創(chuàng)建正確類型的對象,并用持久存留的狀態(tài)來填充它。該對象被壓入執(zhí)行棧,且調(diào)用該方法。對于若干實施例,客戶機/服務(wù)器反串行化器也使用被反串行化的值的確切類型來確定其應(yīng)當(dāng)被反串行化成的CLR類型。如果客戶機以前沒有遇到過該類型,則作出對復(fù)制連接的帶外請求,以按需下載關(guān)于該CLR的元數(shù)據(jù),并用此信息來定位CLR類型(見圖6)。對于若干實施例,可假定所有從T-SQL調(diào)用的方法、屬性和字段都用實例的確切類型而不是調(diào)用地點的聲明類型來動態(tài)地解析。此外,允許在超類型中定義且可直接從T-SQL調(diào)用的所有繼承的方法、屬性和字段。因而,在用于調(diào)用聲明方法與繼承的方法的句法上沒有區(qū)別。對于本發(fā)明的若干實施例,用于定位目標(biāo)調(diào)用的方法可以用偽代碼來如下表現(xiàn)其特征如果D是調(diào)用地點的聲明類型,M是方法名,PI..Pn是該方法的參數(shù),且Tl..Tn是這些參數(shù)的類型,那么如果查詢是"select〈類型D的地點>.M(Pl...Pn)",則該調(diào)用方法將包含startType=D;MethodtargetMethod=null;while(true){If(startType==null)thrownewNoSuchMethodExc印tion(D,M);Method[]methods=GetMethods(startType,M,{Tl...Tn})if(methods.Length==0)17targetMethod=methods;breakjstartType=startType.BaseType;elseif(methods.Length>1)thrownewOverloadedMethodExc印tion(M);6ls6對于用于本發(fā)明若干實施例的方法調(diào)用,方法名匹配使用了二進(jìn)制集合。此外,參數(shù)類型核查確保每個參數(shù)的CLR類型可從SQL參數(shù)類型隱式地轉(zhuǎn)換。并且,如果在同一類型中有兩個合適的方法,則不允許方法重載,但如果這兩個方法取不同個數(shù)的參數(shù)或它們在分層結(jié)構(gòu)中以不同的類型來定義,則允許方法重載。類似地,如果方法或?qū)傩苑祷匾晃聪騍QL注冊的CLR子類型的實例,則系統(tǒng)在運行時會引發(fā)一個錯誤。此外,實際所用的分派指令取決于所解析的方法-即,如果找到的方法被定義為虛擬或重載方法,就使用虛擬分派,否則就使用靜態(tài)分派。對于本發(fā)明的各種實施例,從一類型到其超類型的轉(zhuǎn)換(向上類型轉(zhuǎn)換)總會成功,而對于從一類型到其子類型的轉(zhuǎn)換(向下類型轉(zhuǎn)換),如果其值是正確的類型就會成功,如果不是正確的類型就會失敗,其確切的失敗模式取決于所用的轉(zhuǎn)換算子。對于諸如此類的實施例,有如下三個轉(zhuǎn)換算子CONVERT,CAST及TREAT:*C0NVERT([模式.]類型,目標(biāo)類型)一[模式]類型的值或者如果轉(zhuǎn)換失敗則為錯誤,CAST(值as[模式.]目標(biāo)類型)一[模式.]類型的值或者如果轉(zhuǎn)換失敗則為錯誤.,TREAT(值as[模式.]目標(biāo)類型)一[模式]類型的值或者如果轉(zhuǎn)換失敗為NULL對于這些實施例,CAST和CONVERT可以是現(xiàn)有的算子,它們經(jīng)修改以理解繼承與可替代性。另一方面,TREAT是遵從SQL99的句法(SQL標(biāo)準(zhǔn)的§6.25),供向下類型轉(zhuǎn)換,或當(dāng)超類型的表達(dá)式要被當(dāng)作其子類型之一(該標(biāo)準(zhǔn)稱之為子類型處理)時縮小腳本使用。此算子在兩個上下文中有效(a)用來訪問在子類型中定義的屬性;以及(b)用來更新在子類型中定義的屬性。在編譯時,如果值的聲明類型不是目標(biāo)類型的超類型,將報告一個錯誤,且TREAT將失敗。例如:selectTREAT(personasEmployee).SalaryfromTwherepersonisof(Employee)updateTsetTREAT(personasEmployee).Salary=10000whereID=x另一方面,該標(biāo)準(zhǔn)不支持在NULL實例上調(diào)用賦值器方法,且SQLServer也會對TREAT算子的結(jié)果強加這個限制。如果TREAT產(chǎn)生一NULL值,則在試圖更新該NULL值時系統(tǒng)將引發(fā)一錯誤。換言之,對于本發(fā)明的若干實施例,邏輯上TREAT(值as類型x)可被變換為IF(值ISOF類型x)THEN值elseNULL,如圖7的表中所示,它概括地示出了CONVERT、CAST及TREAT命令的行為和語義。對于若干實施例,并作為UDT擴展的一部分,如果接收者(this)是空值,則SqlUserDefinedTypeAttribute和SqlMethodAttribute上的新性質(zhì)可用于控制是否應(yīng)調(diào)用類型上的方法,盡管通過使用SqlMethodAttribute來將其設(shè)置為真,可對特定方法覆蓋它。對于這些實例,默認(rèn)值為FALSE。此外,如果該方法的返回類型是可為空的類型,則返回該類型的特異的空值。如果返回類型不能為空,則返回該類型默認(rèn)的clr值。引用類型的默認(rèn)值為空,值類型的默認(rèn)值是調(diào)用該類型的默認(rèn)構(gòu)造函數(shù)的結(jié)果。對于各種實施例,系統(tǒng)中所有的空值都是類型化的。然而,由于若值為空,如該標(biāo)準(zhǔn)中所指定的類型謂詞返回未知,因此無法從SQL確定空值的具體類型。因而這些實施例可把所有空值當(dāng)作是調(diào)用地點的聲明類型,而不是插入到地點的值的確切類型。例如,0132]declareOempEmployee0133]setO卿=NULL0134]insertintoPersonsvalues(Oemp)0135]selectpcolfromPersons-returnsanullvalue,thetypeof0136]theinstanceisPerson0137]對于各種實施例,類型謂詞支持以下兩者(a)在列中返回類型及其所有子類型的所有實例,以及(b)在列中返回一特定類型的所有實例(如SQL99標(biāo)準(zhǔn)§8.14中所述)??紤]下列代碼0138]udtCol咖nOrValueIS[NOT]OF(類型指定符)0139]類型指定符::=[ONLY]TYPE[,類型指定符]0140]如果udtColumnOrValue為空,則結(jié)果是未知,否則謂詞返回一布爾類型的結(jié)果。0141]類型謂詞可在其中準(zhǔn)許產(chǎn)生布爾值的表達(dá)式的所有標(biāo)量上下文中使用例如,僅以下類型的實例0142]selectconvert(USAddress,addrcol)asUSAddrColfromAddresseswhereaddrcolisof(onlyUSAddress);這與類型及其所有子類型的實例相反selectconvert(USAddress,addrcol)asUSAddrColfromAddresseswhereaddrcolisof(USAddress);此外,對于本發(fā)明的若干實施例,sys.assembly—types目錄視圖會有如下的附加<table>tableseeoriginaldocumentpage19</column></row><table>0149]此外,對于本發(fā)明的許多實施例,當(dāng)在子類型中覆蓋虛擬方法時,被覆蓋的實現(xiàn)對于在基方法中指定的例程屬性必須是可替代的。在類型注冊時核查該矩陣,且如果檢測到無效組合則產(chǎn)生一個錯誤。這里的指導(dǎo)原則是子類型的實現(xiàn)不應(yīng)破壞基方法的可索引性。因而,如果基方法的定義是可索引的,則覆蓋的實現(xiàn)也應(yīng)是可索引的。此外,子類型的實現(xiàn)不應(yīng)使為基方法定義(空接收器及自變量、sql方面(sqlfacet)、數(shù)據(jù)訪問、賦值器方法調(diào)用)編譯的表達(dá)式無效。另一方面,子類型可添加不與基類型沖突,但需要類型轉(zhuǎn)換或處理以被激活的行為(可索引性)。如果"N"表示"在子類型中是新的",S卩,即使基類型具有設(shè)置為假或未定義的值子類型也可將屬性設(shè)置為真,且如果"S"表示"與基類型定義相同",即,子類型中的定義與基類型中的定義相同,那么UDT方法可包含如圖8中所示的例程屬性。除前述之外,對于本發(fā)明的若干實施例,每個UDT值必須自始至終帶著其特定的type」d,且一旦創(chuàng)建了UDT就永不改變。由于不支持對UDT繼承的二進(jìn)制排序,因此該方法不影響對類型的二進(jìn)制比較(因為所有要進(jìn)行二進(jìn)制比較的實例有相同的type」d)。此外,DROP類型應(yīng)當(dāng)核查沒有列被定義為包含子類型值的任何超類型(從而結(jié)果,DROP類型可能開銷很大)。類似地,添加子類型會使引用鏈中的每個類型的超類型的任何比較方案無效。結(jié)論本文描述的各種系統(tǒng)、方法及技術(shù)可用硬件或軟件,或在適當(dāng)時以兩者的組合來實現(xiàn)。因而,本發(fā)明的方法與裝置,或其特定方面或部分,可以是包含在例如軟盤、CD-R0M、硬盤或任何其他機器可讀存儲介質(zhì)等有形介質(zhì)中的程序代碼(即,指令)的形式,其中,當(dāng)程序代碼被加載到機器,例如計算機,并由其執(zhí)行時,該機器成為用來實施本發(fā)明的裝置。在可編程計算機上的程序代碼執(zhí)行的情況下,計算機通常包括處理器、處理器可讀的存儲介質(zhì)(包括易失性及非易失性存儲器和/或存儲元件)、至少一個輸入設(shè)備及至少一個輸出設(shè)備。一個或多個程序較佳地以高級過程語言或面向?qū)ο蟮木幊陶Z言來實現(xiàn),以與計算機系統(tǒng)通信。然而,如有需要,程序能以匯編語言或機器語言來實現(xiàn)。在任何情況下,語言可以是已編譯或已解釋的語言,并與硬件實現(xiàn)結(jié)合。本發(fā)明的方法與裝置也可以用程序代碼的形式來實施,該代碼通過某一傳輸媒介發(fā)送,例如通過電線或電纜、通過光纖或經(jīng)由任何其他傳輸形式,其中,當(dāng)程序代碼由例如EPR0M、門陣列、可編程邏輯器件(PLD)、客戶計算機、錄象機等等機器接收,并加載到其上由其執(zhí)行時,該機器成為用來實施本發(fā)明的裝置。當(dāng)在通用處理器上實現(xiàn)時,該程序代碼聯(lián)合處理器來提供用于執(zhí)行本發(fā)明的索引功能的唯一裝置。雖然本發(fā)明是結(jié)合各個圖中的較佳實施例來描述的,然而應(yīng)當(dāng)理解,可使用其他類似實施例,或可對所描述的實施例作修改和添加以執(zhí)行本發(fā)明同樣的功能,而不會偏離本發(fā)明。例如,盡管本發(fā)明的示例性實施例是在仿真?zhèn)€人計算機功能的數(shù)字設(shè)備的環(huán)境中描述的,然而本領(lǐng)域技術(shù)人員會意識到,本發(fā)明不限于諸如此類的數(shù)字設(shè)備,正如本申請中所描述的,本發(fā)明可應(yīng)用于任何數(shù)量的現(xiàn)有或新興計算設(shè)備或環(huán)境,例如游戲控制臺、手持式計算機、便攜式計算機等等,不管它們是有線還是無線的,并且本發(fā)明也可應(yīng)用于經(jīng)由通信網(wǎng)絡(luò)連接并在網(wǎng)絡(luò)上交互的任意數(shù)量的諸如此類的計算設(shè)備。此外,必須強調(diào)的是,各種計算機平臺,包括手持設(shè)備操作系統(tǒng)及其他應(yīng)用專用硬件/軟件接口系統(tǒng),已為此文所構(gòu)想,尤其是隨著無線連網(wǎng)設(shè)備的持續(xù)增長。因而,本發(fā)明不應(yīng)限于任一單個實施例,而是應(yīng)當(dāng)根據(jù)所附權(quán)利要求書的廣度及范圍來解釋。權(quán)利要求一種用于在數(shù)據(jù)庫系統(tǒng)中創(chuàng)建用戶定義類型的方法,包括接收實現(xiàn)所述用戶定義類型的結(jié)構(gòu)的類的代碼以及可在所述用戶定義類型的實例上調(diào)用的方法;對所述類實施一合同以確保所述用戶定義類型擔(dān)當(dāng)所述數(shù)據(jù)庫系統(tǒng)的任意標(biāo)量類型的角色,所述合同包括第一要求類指定用于在數(shù)據(jù)庫存儲中持久保存用戶定義類型的實例的多個不同格式之一,所述多個不同格式包括用戶定義類型的實例根據(jù)數(shù)據(jù)庫系統(tǒng)的本機格式來自動串行化的第一格式以及用戶定義類型的實例按由所述類定義的方式串行化的第二格式;第二要求類能夠為該用戶定義類型返回空值;以及第三要求類提供一種用于將用戶定義類型轉(zhuǎn)換為另一類型的方法;存儲關(guān)于所述用戶定義類型的元數(shù)據(jù),以供所述數(shù)據(jù)庫系統(tǒng)接下來創(chuàng)建該用戶定義類型的實例時使用;以及僅當(dāng)所述類滿足所述合同的要求時,創(chuàng)建所述用戶定義類型的實例。2.如權(quán)利要求1所述的方法,其特征在于,所述用于在數(shù)據(jù)庫存儲中持久保存用戶定義類型的實例的多個不同格式進(jìn)一步包括用戶定義類型的實例按MICROSOFT.NET框架提供的方法進(jìn)行串行化的第三格式。3.如權(quán)利要求1所述的方法,其特征在于,進(jìn)一步包括將所述用戶定義類型例示為表中的列值、變量、例程的參數(shù)、或例程的返回值之一。4.如權(quán)利要求1所述的方法,其特征在于,進(jìn)一步包括接收所述數(shù)據(jù)庫系統(tǒng)的查詢語言的表達(dá)式,其中所述表達(dá)式的求值需要對該用戶定義類型的實例的方法進(jìn)行調(diào)用;將該表達(dá)式翻譯成一程序代碼指令序列以調(diào)用所述用戶定義類型的實例上所需的方法;根據(jù)程序代碼的執(zhí)行來調(diào)用所述方法;以及將所述方法調(diào)用的結(jié)果作為查詢語言表達(dá)式的求值返回。5.如權(quán)利要求1所述的方法,其特征在于,定義所述用戶定義類型的類包括一增變器方法,當(dāng)被調(diào)用時,使得所述用戶定義類型的值被改變,并且其中,所述方法進(jìn)一步包括在所述用戶定義類型的實例上調(diào)用該增變器方法以改變所述實例的值。6.如權(quán)利要求1所述的方法,其特征在于,定義所述結(jié)構(gòu)和用戶定義類型的方法的所述類還包括屬性,該屬性指定該用戶定義類型的實例串行化的二進(jìn)制表示將按二進(jìn)制排序。7.如權(quán)利要求6所述的方法,其特征在于,進(jìn)一步包括串行化所述用戶定義類型的實例,以便所述實例的二進(jìn)制表示按二進(jìn)制排序;接收要求將所述用戶定義類型的第一實例與所述用戶定義類型的第二實例進(jìn)行比較的所述數(shù)據(jù)庫系統(tǒng)的查詢語言的表達(dá)式;將所述用戶定義類型的第一實例和第二實例的串行化的二進(jìn)制表示進(jìn)行比較以對該表達(dá)式求值,而無須反串行化任一實例。8.如權(quán)利要求6所述的方法,其特征在于,進(jìn)一步包括在數(shù)據(jù)庫存儲中創(chuàng)建一表,在所述表中,所述表的列的類型被定義為所述用戶定義類型;以及在所述列上創(chuàng)建索引。9.如權(quán)利要求6所述的方法,其特征在于,進(jìn)一步包括串行化所述用戶定義類型的實例,以便所述實例的二進(jìn)制表示按二進(jìn)制排序;接收要求調(diào)用所述用戶定義類型的一方法的求值的所述數(shù)據(jù)庫系統(tǒng)的查詢語言的表達(dá)式;生成所述表達(dá)式上的計算的列;以及創(chuàng)建所述計算的列上的索引。10.—種實現(xiàn)數(shù)據(jù)庫系統(tǒng)的計算機系統(tǒng),所述計算機系統(tǒng)包括處理單元;存儲器;運行庫,在所述處理單元上執(zhí)行,并提供在所述數(shù)據(jù)庫系統(tǒng)內(nèi)的代碼執(zhí)行;以及在所述處理單元上執(zhí)行的數(shù)據(jù)庫服務(wù)器,所述數(shù)據(jù)庫服務(wù)器使得所述用戶定義類型的實例能以多種不同的格式持久存留在數(shù)據(jù)庫存儲上,所述格式至少包括第一格式和第二格式,在第一格式中,用戶定義類型的實例依據(jù)數(shù)據(jù)庫服務(wù)器的本機格式被自動串行化,而在第二格式中,用戶定義類型的實例以用戶定義類型自身所定義的方式被串行化,所述數(shù)據(jù)庫服務(wù)器,接收代碼,所述代碼實現(xiàn)定義所述用戶定義類型的結(jié)構(gòu)的類以及可在所述用戶定義類型的實例上調(diào)用的的方法,以及對類實施一合同以確保所述用戶定義類型擔(dān)當(dāng)所述數(shù)據(jù)庫系統(tǒng)的任意標(biāo)量類型的角色,所述合同包括第一要求所述類指定用于在數(shù)據(jù)庫存儲中持久保存用戶定義類型的實例的多個不同格式之一;第二要求所述類能夠為該用戶定義類型返回空值;以及第三要求所述類提供一種用于將用戶定義類型轉(zhuǎn)換為另一類型的方法;所述數(shù)據(jù)庫服務(wù)器存儲關(guān)于所述用戶定義類型的元數(shù)據(jù),以供所述數(shù)據(jù)庫系統(tǒng)接下來創(chuàng)建該用戶定義類型的實例時使用;以及僅當(dāng)所述類滿足所述合同的要求時,創(chuàng)建所述用戶定義類型的實例。11.如權(quán)利要求10所述的計算機系統(tǒng),其特征在于,所述數(shù)據(jù)庫服務(wù)器也使得所述用戶定義類型的實例以第三格式被存儲,在所述第三格式中,用戶定義類型的實例按MICROSOFT.NET框架提供的方法進(jìn)行串行化,并且所述合同的第一要求要求所述類指定所述至少第一格式、第二格式或第三格式之一用于將用戶定義類型的實例持久保存在所述數(shù)據(jù)庫存儲中。12.如權(quán)利要求IO所述的計算機系統(tǒng),其特征在于,所述數(shù)據(jù)流系統(tǒng)的用戶能將所述用戶定義類型例示為表中的列值、變量、例程的參數(shù)或例程的返回值之一。13.如權(quán)利要求10所述的方法,其特征在于,進(jìn)一步包括查詢處理器,用于(i)接收所述數(shù)據(jù)庫系統(tǒng)的查詢語言的表達(dá)式,其中所述表達(dá)式的求值需要對該用戶定義類型的實例的方法進(jìn)行調(diào)用,(ii)將該表達(dá)式翻譯成一程序代碼指令序列以調(diào)用所述用戶定義類型的實例上所需的方法;(iii)根據(jù)程序代碼的執(zhí)行來調(diào)用所述方法;以及(iv)將所述方法調(diào)用的結(jié)果作為查詢語言表達(dá)式的求值返回。14.如權(quán)利要求10所述的計算機系統(tǒng),其特征在于,定義所述用戶定義類型的類包括一增變器方法,當(dāng)被調(diào)用時,使得所述用戶定義類型的值被改變,并且其中,所述數(shù)據(jù)庫服務(wù)器在所述用戶定義類型的實例上調(diào)用該增變器方法以改變所述實例的值。15.如權(quán)利要求IO所述的計算機系統(tǒng),其特征在于,定義所述結(jié)構(gòu)和用戶定義類型的方法的所述類還包括屬性,該屬性指定該用戶定義類型的實例串行化的二進(jìn)制表示將按二進(jìn)制排序。16.如權(quán)利要求15所述的計算機系統(tǒng),其特征在于,所述計算機系統(tǒng)串行化所述用戶定義類型的實例,以便所述實例的二進(jìn)制表示按二進(jìn)制排序,并且當(dāng)所述數(shù)據(jù)庫服務(wù)器接收要求將所述用戶定義類型的第一實例與所述用戶定義類型的第二實例進(jìn)行比較的所述數(shù)據(jù)庫系統(tǒng)的查詢語言的表達(dá)式時,將所述用戶定義類型的第一實例和第二實例的串行化的二進(jìn)制表示進(jìn)行比較以對該表達(dá)式求值,而無須反串行化任一實例。17.如權(quán)利要求15所述的計算機系統(tǒng),其特征在于,所述數(shù)據(jù)庫服務(wù)器在數(shù)據(jù)庫存儲中創(chuàng)建一表,在所述表中,所述表的列的類型被定義為所述用戶定義類型,并且所述數(shù)據(jù)庫服務(wù)器在所述列上創(chuàng)建索引。18.如權(quán)利要求15所述的計算機系統(tǒng),其特征在于,所述數(shù)據(jù)庫服務(wù)器串行化所述用戶定義類型的實例,以便所述實例的二進(jìn)制表示按二進(jìn)制排序,并且當(dāng)所述數(shù)據(jù)庫服務(wù)器接收要求調(diào)用所述用戶定義類型的一方法的求值的所述數(shù)據(jù)庫系統(tǒng)的查詢語言的表達(dá)式時,所述數(shù)據(jù)庫服務(wù)器生成所述表達(dá)式上的計算的列并創(chuàng)建所述計算的列上的索引。19.一種系統(tǒng),包括至少一個處理器;通信耦合于所述至少一個處理器的計算存儲器,所述計算存儲器操作用于存儲和檢索由受管代碼創(chuàng)建的類所定義的至少一個用戶定義類型,所述類包括描述所述至少一個用戶定義類型的結(jié)構(gòu)的信息以及描述所述至少一個用戶定義類型和第二用戶定義類型之間的繼承關(guān)系的信息,其中所述第二用戶定義類型相對于所述至少一個用戶定義類型的繼承關(guān)系為所述至少一個用戶定義類型的至少一個子類型或超類型;具有可擴展類型系統(tǒng)存儲在所述計算存儲器中的數(shù)據(jù)庫,所述定義至少一個用戶定義類型的由受管代碼創(chuàng)建的類被編譯到一個組件,該組件向所述數(shù)據(jù)庫明確注冊,以便所述用戶定義類型擔(dān)當(dāng)結(jié)構(gòu)查詢語言(SQL)類型系統(tǒng)中的標(biāo)量類型的角色,所述明確注冊指示了所述至少一種用戶定義類型與所述第二用戶定義類型之間的所述繼承關(guān)系。20.如權(quán)利要求19所述的系統(tǒng),其特征在于,所述第二用戶定義類型是所述至少一種用戶定義類型的子類型。21.如權(quán)利要求19所述的系統(tǒng),其特征在于,所述第二用戶定義類型是所述至少一種用戶定義類型的超類型。22.如權(quán)利要求19所述的系統(tǒng),其特征在于,所述至少一種用戶定義類型由公共語言運行庫(CLR)語句來定義。23.如權(quán)利要求19所述的系統(tǒng),其特征在于,所述受管代碼以下編程語言組中的至少一種編程語言來定義或得到visualbasic、visualC++、C、C++及C#("C升半音號")。24.如權(quán)利要求19所述的系統(tǒng),其特征在于,包括用于將類型編譯到所述組件的子系統(tǒng);用于向所述數(shù)據(jù)庫注冊所述組件的子系統(tǒng);用于向所述數(shù)據(jù)庫注冊所述組件的所述類型的子系統(tǒng);以及用于使用所述類型的子系統(tǒng)。25.—種至少部分由計算系統(tǒng)實現(xiàn)的用于在存儲器中存儲的數(shù)據(jù)庫中提供用于至少一個用戶定義類型的擴展類型系統(tǒng)的方法,所述方法包括在存儲器中存儲由受管代碼創(chuàng)建的類,所述類包括描述所述至少一個用戶定義類型的結(jié)構(gòu)的信息,其中,所述類被編譯到組件中;在存儲器中存儲用于描述所述至少一個用戶定義類型和所述至少一個用戶定義類型中的第二用戶定義類型之間的繼承關(guān)系的信息,其中所述第二用戶定義類型相對于所述至少一個用戶定義類型的繼承關(guān)系為所述至少一個用戶定義類型的至少一個子類型或超類型;執(zhí)行所述組件向存儲在存儲器中的數(shù)據(jù)庫的明確注冊,以便所述用戶定義類型擔(dān)當(dāng)結(jié)構(gòu)查詢語言(SQL)類型系統(tǒng)中的標(biāo)量類型的角色,所述明確注冊使得所述數(shù)據(jù)庫知道所述至少一種用戶定義類型與所述第二用戶定義類型之間的所述繼承關(guān)系。26.如權(quán)利要求25所述的方法,其特征在于,進(jìn)一步包括創(chuàng)建為所述至少一個用戶定義類型的子類型的所述第二用戶定義類型。27.如權(quán)利要求25所述的方法,其特征在于,進(jìn)一步包括創(chuàng)建為所述第二用戶定義類型的子類型的所述至少一個用戶定義類型。28.如權(quán)利要求25所述的方法,其特征在于,進(jìn)一步包括使用公共語言運行庫(CLR)語句來定義所述至少一個用戶定義類型。29.如權(quán)利要求25所述的方法,其特征在于,其中所述受管代碼以下編程語言組中的至少一種編程語言來定義或得到visualbasic、visualC++、C、C++及C#("C升半音號")。30.如權(quán)利要求29所述的方法,其特征在于,進(jìn)一步包括將類型編譯到所述組件;向所述數(shù)據(jù)庫注冊所述組件;向所述數(shù)據(jù)庫注冊所述組件的所述類型;以及使用所述類型。31.如權(quán)利要求25所述的方法,其特征在于,所述至少一種用戶定義類型是用除順序查詢語言(SQL)語句以外的語句來定義的。32.如權(quán)利要求25所述的方法,其特征在于,進(jìn)一步包括使用除順序查詢語言(SQL)語句以外的語句來定義所述至少一種用戶定義類型。33.—種至少部分由計算系統(tǒng)實現(xiàn)的用于在存儲器中存儲的數(shù)據(jù)庫中提供用于至少一個用戶定義類型的元數(shù)據(jù)的可查詢目錄視圖的方法,所述方法包括在存儲器中存儲用于描述所述至少一個用戶定義類型的結(jié)構(gòu)的信息;在存儲器中存儲用于描述所述至少一個用戶定義類型和所述至少一個用戶定義類型中的第二用戶定義類型之間的繼承關(guān)系的信息,其中所述第二用戶定義類型相對于所述至少一個用戶定義類型的繼承關(guān)系為所述至少一個用戶定義類型的至少一個子類型或超類型;在用于所述至少一個用戶定義類型的元數(shù)據(jù)中記錄所述至少一個用戶定義類型和第二用戶定義類型之間的繼承關(guān)系,其中所述元數(shù)據(jù)可通過被查詢的可查詢目錄視圖而被搜索;以及在存儲器中存儲所述元數(shù)據(jù)。34.—種至少部分由計算系統(tǒng)實現(xiàn)的用于在存儲器中存儲元數(shù)據(jù)的數(shù)據(jù)庫中搜索至少一個用戶定義類型的替換范圍的方法,包括查詢用戶定義類型的元數(shù)據(jù)以識別所述至少一個用戶定義類型以及存儲的描述與第二用戶定義類型的繼承關(guān)系的信息;識別所述至少一個用戶定義類型,其中所描述的繼承關(guān)系為所述第二用戶定義類型是所述至少一個用戶定義類型的子類型;識別所述至少一個用戶定義類型的站點的屬性,其中所述站點具有相關(guān)聯(lián)類型定義以及規(guī)定哪里的子類型的值可替換所述至少一個用戶定義類型的值的一屬性;將所述第二用戶定義類型的值替換所述至少一個用戶定義類型的值。35.—種至少部分由計算系統(tǒng)實現(xiàn)的用于在存儲器中存儲的數(shù)據(jù)庫中提供用于至少一個用戶定義類型的元數(shù)據(jù)的可查詢目錄視圖的方法,所述方法包括在存儲器中存儲用于描述所述至少一個用戶定義類型的結(jié)構(gòu)的信息,其中描述的繼承關(guān)系為所述至少一個用戶定義類型是超類型,而第二用戶定義類型是所述超類型的子類型;識別所述超類型的一個值的運行時類型,其中所述值的運行時類型可以與所述超類型的編譯時的值不同;在所述值的運行時類型上創(chuàng)建索引;基于所述值的運行時類型在預(yù)測中使用所述索引。全文摘要本發(fā)明的各種實施例針對具有用于至少一種用戶定義類型的可擴展類型系統(tǒng)的數(shù)據(jù)庫,該用戶定義類型包含用于描述其結(jié)構(gòu)的信息及描述其與另一用戶定義類型(子類型或超類型/基類型)間的繼承關(guān)系的信息。對于某些實施例,該用戶定義類型是用除順序查詢語言(SQL)語句以外的語句,例如公共語言運行時間(CLR)語句、C、C++及C#(“C升半音號”)語句、和/或visualbasic語句來定義的。在任一情況下,若干實施例還針對一種系統(tǒng),其中通過向所述數(shù)據(jù)庫明確地注冊該用戶定義類型,使數(shù)據(jù)庫知道兩個用戶定義類型間的繼承關(guān)系。文檔編號G06F7/00GK101751469SQ200910258389公開日2010年6月23日申請日期2004年7月29日優(yōu)先權(quán)日2004年2月10日發(fā)明者B·賽茲金,D·Y·阿爾圖多夫,J·A·布萊克雷,R·凡卡特施,W·俞申請人:微軟公司