版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1本章概述5.1掌握xml數(shù)據(jù)類型的用法5.2定義XML的架構(gòu)集合5.3理解XML查詢方法5.4掌握發(fā)布XML數(shù)據(jù)方法25-1XML數(shù)據(jù)類型1、概述SQLServer2005數(shù)據(jù)庫(kù)中存儲(chǔ)XML文檔和XML片段,xml數(shù)據(jù)類型使您可以在SQLServer數(shù)據(jù)庫(kù)中存儲(chǔ)XML文檔和片段,XML片段是缺少單個(gè)頂級(jí)元素的XML實(shí)例;還可以用Transact-SQL變量來(lái)存儲(chǔ)XML,您可以創(chuàng)建xml類型的列和變量,并在其中存儲(chǔ)XML實(shí)例。請(qǐng)注意,xml數(shù)據(jù)類型實(shí)例的存儲(chǔ)表示形式不能超過(guò)2GB。5-1-1
XML數(shù)據(jù)類型列設(shè)置xml數(shù)據(jù)類型屬性時(shí)沒(méi)有必要做什么特殊的操作。但是應(yīng)該了解一個(gè)屬性:XML模式命名空間屬性。這個(gè)屬性是一個(gè)內(nèi)置的函數(shù),用于接收一個(gè)目標(biāo)XML模式的命名空間、XML模式集,或是一個(gè)相關(guān)模式的名稱。如果沒(méi)有設(shè)置這個(gè)屬性,SQLServer會(huì)自動(dòng)映射一個(gè)XML實(shí)例以保證該列有必要的XML模式。它不會(huì)返回預(yù)定義的XML模式。例如:ALTERTABLEEmployeesADDEmployeeInfoxml35-1XML數(shù)據(jù)類型5-1-2
XML數(shù)據(jù)類型變量xml數(shù)據(jù)類型遠(yuǎn)不只是用于創(chuàng)建表,還可以把它作為一個(gè)變量。下面的語(yǔ)法展示的是如何把它用做一個(gè)變量:DECLARE@xmlVarxml實(shí)驗(yàn)1:聲明一個(gè)xml數(shù)據(jù)類型的變量CREATEPROCEDUREGetEmployeeInfo@EmployeeID[int]WITHEXECUTEASCALLERASDECLARE@EmployeeInfoxml這個(gè)存儲(chǔ)過(guò)程聲明了一個(gè)xml數(shù)據(jù)類型的變量用于存儲(chǔ)XML文檔或片段45-1XML數(shù)據(jù)類型5-1-3
XML數(shù)據(jù)類型參數(shù)實(shí)驗(yàn)2:以xml數(shù)據(jù)類型作為一個(gè)輸出參數(shù)
CREATEPROCEDUREGetEmployeeInfo@EmployeeID[int],@EmployeeInfo[xml]OUTPUTWITHEXECUTEASCALLERAS這個(gè)示例中以xml數(shù)據(jù)類型作為一個(gè)輸出參數(shù)。執(zhí)行調(diào)用的應(yīng)用程序無(wú)論是SQLServer自身的程序還是一個(gè).NET應(yīng)用程序,都可以調(diào)用這個(gè)存儲(chǔ)過(guò)程并給它傳遞xml參數(shù)55-1XML數(shù)據(jù)類型5-1-4函數(shù)返回XML數(shù)據(jù)類型值實(shí)驗(yàn)3:函數(shù)返回Employee表中XML數(shù)據(jù)類型值
CREATEFUNCTIONdbo.ReturnXML()RETURNSxmlWITHEXECUTEASCALLERASBEGINDECLARE@EmployeeInfoxmlSET@EmployeeInfo='<Employee><FirstName>Scott</FirstName><LastName>Klein</LastName></Employee>'RETURN(@EmployeeInfo)ENDGO對(duì)于這個(gè)已經(jīng)建好的函數(shù),可以用如下方法執(zhí)行它:SELECTdbo.ReturnXML()返回的結(jié)果如下所示:<Employee><FirstName>Scott</FirstName><LastName>Klein</LastName></Employee>65-2XML的架構(gòu)集合XML有兩種類型:非類型XML和類型化XML,而且SQLServer2005中的XML數(shù)據(jù)類型對(duì)這兩種類型都提供支持。本節(jié)會(huì)重點(diǎn)講解非類型XML和類型化XML的區(qū)別,以及在什么場(chǎng)合下應(yīng)該使用哪一種類型。5-2-1非類型XML非類型XML就是說(shuō)XML文檔沒(méi)有和任何模式相關(guān)聯(lián)實(shí)驗(yàn)1:Employee表中創(chuàng)建一個(gè)xml列
CREATETABLEEmployee([EmployeeID][int]NOTNULL,[EmployeeInfo][xml]NOTNULL)ON[PRIMARY]GO75-2XML的架構(gòu)集合實(shí)驗(yàn)2:非類型XML數(shù)據(jù)類型列的值插入Employee表中
DECLARE@xmlvarvarchar(200)SET@xmlvar='<Employee><FirstName>Horatio</FirstName><LastName>Hornblower</LastName><HireDate>05/01/1850</HireDate></Employee>'INSERTINTOEmployee(EmployeeID,EmployeeInfo)VALUES(1,@xmlvar)GO85-2XML的架構(gòu)集合實(shí)驗(yàn)3:存儲(chǔ)過(guò)程接收xml數(shù)據(jù)類型參數(shù)將數(shù)據(jù)錄入Employee表中
CREATEPROCEDUREAddEmployee@xmlvar[xml]WITHEXECUTEASOWNERASINSERTINTOEmployee(EmployeeID,EmployeeInfo)VALUES(2,@xmlvar)然后在一個(gè)查詢窗口中執(zhí)行如下代碼:DECLARE@xmlvarvarchar(200)SET@xmlvar='<Employee><FirstName>Hortense</FirstName><LastName>Powdermaker</LastName><HireDate>03/01/1932</HireDate></Employee>'EXECAddEmployee@xmlvarGO95-2XML的架構(gòu)集合5-2-2
XML架構(gòu)使用CREATEXMLSCHEMACOLLECTION語(yǔ)句時(shí),將把各種架構(gòu)組件導(dǎo)入數(shù)據(jù)庫(kù)中。架構(gòu)組件包括架構(gòu)元素、屬性和類型定義。案例:請(qǐng)考察并設(shè)計(jì)出下面XML的架構(gòu)(見(jiàn)下)存儲(chǔ)在數(shù)據(jù)庫(kù)中的架構(gòu)組件分為以下幾個(gè)類別(組件種類):ELEMENT、ATTRIBUTE、TYPE(用于簡(jiǎn)單或復(fù)雜類型)、ATTRIBUTEGROUP、MODELGROUP。下面是組件與特定類別的關(guān)系:SomeAttribute是ATTRIBUTE種類的組件。SomeType、OrderType和CustomerType是TYPE種類的組件。Customer是ELEMENT種類的組件。將架構(gòu)導(dǎo)入數(shù)據(jù)庫(kù)中時(shí),SQLServer不存儲(chǔ)架構(gòu)本身,而是存儲(chǔ)各個(gè)組件。也就是說(shuō),不存儲(chǔ)<Schema>標(biāo)記,僅存儲(chǔ)在其中定義的組件。105-2XML的架構(gòu)集合5-2-3類型化XML
當(dāng)用一個(gè)描述XML數(shù)據(jù)的架構(gòu)集合來(lái)關(guān)聯(lián)一個(gè)XML文檔的時(shí)候,該XML文檔被稱為類型化。使用XML模式有幾個(gè)優(yōu)點(diǎn)。第一,XML驗(yàn)證是自動(dòng)的;第二,XML存儲(chǔ)的內(nèi)容是最少的;實(shí)驗(yàn)4:XML文檔作為xml數(shù)據(jù)類型列存入Employee表<EmployeeEmployeeID="1"><FirstName></FirstName><LastName></LastName><Address></Address><City></City><State></State><Zip></Zip></Employee>115-2XML的架構(gòu)集合5-2-3類型化XML第一步:創(chuàng)建一個(gè)XML架構(gòu)首先要?jiǎng)?chuàng)建必要的模式用于創(chuàng)建一個(gè)XML架構(gòu)集合,然后在創(chuàng)建表時(shí)使用這個(gè)XML架構(gòu)集合。用CREATEXMLSCHEMACOLLECTION語(yǔ)句創(chuàng)建架構(gòu)集合,命名為EmployeeSchemaCollection?;谏厦娼o出的XML文檔,創(chuàng)建如下的模式125-2XML的架構(gòu)集合5-2-3類型化XML第二步:使用架構(gòu)集合創(chuàng)建了XML架構(gòu)集合之后,創(chuàng)建新表時(shí)就可以使用這個(gè)架構(gòu)集合,如下面的代碼所示。把架構(gòu)集合與xml數(shù)據(jù)類型列關(guān)聯(lián)的過(guò)程使得這一列現(xiàn)在變成了類型化的列:CREATETABLEEmployee([EmployeeID][int]NOTNULL,[EmployeeInfo][xml](EmployeeSchemaCollection)NOTNULL)ON[PRIMARY]GO135-2XML的架構(gòu)集合5-2-3類型化XML第三步:插入一行數(shù)據(jù)現(xiàn)在可以向Employee表中插入一行數(shù)據(jù),代碼如下:INSERTINTOEmployeeVALUES(1,'<EmployeeEmployeeID="1"><FirstName>Hortense</FirstName><LastName>Powdermaker</LastName><Address>BEIJING108</Address><City>BEIJING</City><State>BEIJING</State><Zip>101108</Zip></Employee>')145-3XML查詢方法5-3-1value方法value方法:如果要提取一個(gè)XML實(shí)例(尤其是一個(gè)xml數(shù)據(jù)類型列、變量或參數(shù))的某個(gè)節(jié)點(diǎn)的值,value()方法是非常有用的。它返回XQuery表達(dá)式計(jì)算的值。這個(gè)方法的語(yǔ)法如下所示:value(XQueryExpression,SQLType)實(shí)驗(yàn)1:對(duì)xml類型的變量使用value()方法在以下示例中,某個(gè)xml類型的變量中存儲(chǔ)有XML實(shí)例。value()方法將從XML中檢索ProductID屬性值。然后將該值分配給int變量155-3XML查詢方法5-3-1value方法實(shí)驗(yàn)2:使用value()方法從xml類型的列中檢索值對(duì)AdventureWorks數(shù)據(jù)庫(kù)中的某個(gè)xml類型列(CatalogDescription)指定了以下查詢。此查詢將從該列中存儲(chǔ)的每個(gè)XML實(shí)例中檢索ProductModelID屬性值165-3XML查詢方法5-3-2
query()方法實(shí)驗(yàn)3:對(duì)xml類型的變量使用query()方法如果想從一個(gè)XML實(shí)例中返回某些部分,query()方法將會(huì)是一個(gè)很好的選擇。query()方法通過(guò)針對(duì)XML實(shí)例中的元素和屬性測(cè)評(píng)一個(gè)XQuery表達(dá)式來(lái)執(zhí)行查詢。返回的結(jié)果是一個(gè)無(wú)類型XML。query()方法的語(yǔ)法如下所示:query('XQueryExpression')175-3XML查詢方法5-3-3
exist()方法實(shí)驗(yàn)1:對(duì)xml類型變量指定exist()方法exist()方法能夠檢查XML實(shí)例中某個(gè)指定的XML片段是否存在。如果存在,返回值為1;如果不存在,返回值為0。exist()方法的語(yǔ)法如下所示:exist('XQeuryExpression')下面的示例中,@x是一個(gè)xml類型變量(非類型化的xml),@f是一個(gè)整數(shù)類型變量,用于存儲(chǔ)exist()方法返回的值。如果XML實(shí)例中存儲(chǔ)的日期值為2002-01-01,則exist()方法返回True(1)185-3XML查詢方法5-3-3
exist()方法實(shí)驗(yàn)2:對(duì)類型化的xml變量指定exist()方法下面的示例說(shuō)明了在AdventureWorks數(shù)據(jù)庫(kù)中如何對(duì)xml類型變量使用exist()方法。它是類型化的XML變量在該示例中,首先將生產(chǎn)說(shuō)明文檔分配給此變量,然后使用exist()方法查看文檔中是否包含LocationID屬性值為50的<Location>元素。如果生產(chǎn)說(shuō)明文檔包含LocationID=50的<Location>元素,則對(duì)@x變量指定的exist()方法返回1(True)。否則,該方法返回0(False)195-3XML查詢方法5-3-4
nodes()方法實(shí)驗(yàn)1:對(duì)xml類型的變量使用nodes()方法nodes()方法的一般語(yǔ)法如下如示:Nodes(XQuery)asTable(Column)XQuery參數(shù)指定XQuery表達(dá)式。如果語(yǔ)句返回節(jié)點(diǎn),那么節(jié)點(diǎn)包含在結(jié)果集中。類似地,如果表達(dá)式的結(jié)果為空,那么結(jié)果集也為空。Table(Column)參數(shù)指定了最終結(jié)果集中的表名和列名。在此示例中,現(xiàn)有一個(gè)包含<Root>頂級(jí)元素和三個(gè)<row>子元素的XML文檔。此查詢使用nodes()方法為每個(gè)<row>元素設(shè)置單獨(dú)的上下文節(jié)點(diǎn)。nodes()方法返回包含三行的行集。每行都有一個(gè)原始XML的邏輯副本,其中每個(gè)上下文節(jié)點(diǎn)都標(biāo)識(shí)原始文檔中的一個(gè)不同的<row>元素。然后,查詢會(huì)從每行返回上下文節(jié)點(diǎn):205-3XML查詢方法5-3-5
modify()方法實(shí)驗(yàn)1:如何使用modify()方法modify()方法的語(yǔ)法如下所示:Modify(XMLDML)xml數(shù)據(jù)類型的modify()方法允許在一個(gè)XML實(shí)例內(nèi)插入、更新(替換值)和刪除內(nèi)容。modify()方法用XMLDML提供對(duì)XML實(shí)例的這些操作。在此示例中,現(xiàn)有一個(gè)包含<Root>頂級(jí)元素和三個(gè)<row>子元素的XML文檔。此查詢使用nodes()方法為每個(gè)<row>元素設(shè)置單獨(dú)的上下文節(jié)點(diǎn)。nodes()方法返回包含三行的行集。每行都有一個(gè)原始XML的邏輯副本,其中每個(gè)上下文節(jié)點(diǎn)都標(biāo)識(shí)原始文檔中的一個(gè)不同的<row>元素。然后,查詢會(huì)從每行返回上下文節(jié)點(diǎn):215-3XML查詢方法5-3-5
modify()方法實(shí)驗(yàn)1:如何使用modify()方法在這個(gè)示例中定義了一個(gè)xml數(shù)據(jù)類型的變量,并把一個(gè)XML文檔賦給它。然后modify()針對(duì)這個(gè)變量執(zhí)行插入,給這個(gè)變量插入了一個(gè)新的節(jié)點(diǎn)和值。對(duì)XML文檔執(zhí)行modify()方法的結(jié)果如下所示:225-4發(fā)布XML數(shù)據(jù)在
FORXML子句中,指定以下模式之一:RAW、AUTO、EXPLICIT、PATH。
RAW模式將為SELECT語(yǔ)句所返回行集中的每行生成一個(gè)<row>元素。可以通過(guò)編寫(xiě)嵌套FORXML查詢來(lái)生成XML層次結(jié)構(gòu)。
AUTO模式將基于指定SELECT語(yǔ)句的方式來(lái)使用試探性方法在XML結(jié)果中生成嵌套。您對(duì)生成的XML的形狀具有最低限度的控制能力。除了AUTO模式的試探性方法生成的XML形狀之外,還可以編寫(xiě)FORXML查詢來(lái)生成XML層次結(jié)構(gòu)。
EXPLICIT模式允許對(duì)XML的形狀進(jìn)行更多控制。235-4發(fā)布XML數(shù)據(jù)5-4-1RAW模式下列示例中的查詢顯示了如何與各個(gè)選項(xiàng)一起使用FORXMLRAW模式。其中許多查詢都是根據(jù)ProductModel表中Instructions列標(biāo)明的自行車生產(chǎn)說(shuō)明XML文檔指定的實(shí)驗(yàn)1:檢索XML形式的產(chǎn)品型號(hào)信息245-4發(fā)布XML數(shù)據(jù)5-4-1RAW模式下面的查詢將指定ELEMENTS指令以便從查詢結(jié)果生成以元素為中心的XML實(shí)驗(yàn)2:指定XSINIL和ELEMENTS指令以生成NULL列值的元素255-4發(fā)布XML數(shù)據(jù)5-4-2AUTO模式實(shí)驗(yàn)1:在FORXML子句中指定了AUTO模式265-4發(fā)布XML數(shù)據(jù)5-4-2AUTO模式對(duì)于SELECT子句,注意下列內(nèi)容:(1)CustomerID引用Cust表。因此,創(chuàng)建一個(gè)<Cust>元素,CustomerID作為其屬性添加。(2)接下來(lái)的三列OrderHeader.CustomerID、OrderHeader.SaleOrderID和OrderHeader.Status引用OrderHeader表。因此,為<Cust>元素添加<OrderHeader>子元素,這三列作為<OrderHeader>的屬性添加。(3)接著,Cust.CustomerType列再次引用Cust表,該表已由Cust.CustomerID列標(biāo)識(shí)。因此,不創(chuàng)建新元素,而是為以前創(chuàng)建的<Cust>元素添加CustomerType屬性。(4)查詢?yōu)楸砻付▌e名。這些別名顯示為相應(yīng)的元素名。(5)需要使用ORDERBY對(duì)一個(gè)父級(jí)下的所有子級(jí)分組。下面的查詢與上一個(gè)查詢類似,不同的是SELECT子句先指定OrderHeader表中的列,再指定Cust表中的列。因此,首先創(chuàng)建<OrderHeader>元素,然后為該元素添加<Cust>子元素275-4發(fā)布XML數(shù)據(jù)5-4-4PATH模式在PATH模式中,列名或列別名被作為XPath表達(dá)式來(lái)處理。這些表達(dá)式指明了如何將值映射到XML。每個(gè)XPath表達(dá)式都是一個(gè)相對(duì)XPath,它提供了項(xiàng)類型(例如屬性、元素和標(biāo)量值)以及將相對(duì)于行元素而生成的節(jié)點(diǎn)的名稱和層次結(jié)構(gòu)。本主題說(shuō)明了下列條件,將映射行集中具備這些條件的列:沒(méi)有名稱的列;具有名稱的列;名稱被指定為通配符(*)的列;以某個(gè)XPath節(jié)點(diǎn)測(cè)試的名稱命名的列;以指定為data()的路徑命名的列;默認(rèn)情況下包含NULL值的列。285-4發(fā)布XML數(shù)據(jù)5-4-4PATH模式1.沒(méi)有名稱的列任何沒(méi)有名稱的列都將被內(nèi)聯(lián)。例如,未指定列別名的計(jì)算列或嵌套標(biāo)量查詢將生成沒(méi)有名稱的列。如果該列屬于xml類型,則將插入該數(shù)據(jù)類型的實(shí)例的內(nèi)容。否則,列內(nèi)容將被作為文本節(jié)點(diǎn)插入。實(shí)驗(yàn)1:查詢將返回一個(gè)包含三列的行集。第三列沒(méi)有名
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度高新技術(shù)產(chǎn)業(yè)合作合同風(fēng)險(xiǎn)管理與保障3篇
- 2024版銷售代理居間協(xié)議3篇
- 2025年煙草制品倉(cāng)儲(chǔ)物流服務(wù)合同2篇
- 2024配送合同模板
- 2025年度二零二五年度電商平臺(tái)攤位合作租賃協(xié)議3篇
- 二零二五年度門(mén)禁系統(tǒng)市場(chǎng)分析與營(yíng)銷推廣合同3篇
- 二零二四年幼兒園糕點(diǎn)品牌授權(quán)與校園市場(chǎng)合作合同3篇
- 2025年度鉆井工程安全與環(huán)保管理合同范本3篇
- 二零二四年專業(yè)舞臺(tái)燈光音響租賃合同標(biāo)準(zhǔn)模板3篇
- 二零二四年保險(xiǎn)合同及理賠服務(wù)合同
- 春節(jié)行車安全常識(shí)普及
- 電機(jī)維護(hù)保養(yǎng)專題培訓(xùn)課件
- 汽車租賃行業(yè)利潤(rùn)分析
- 春節(jié)拜年的由來(lái)習(xí)俗來(lái)歷故事
- 2021火災(zāi)高危單位消防安全評(píng)估導(dǎo)則
- 佛山市服務(wù)業(yè)發(fā)展五年規(guī)劃(2021-2025年)
- 房屋拆除工程監(jiān)理規(guī)劃
- 醫(yī)院保安服務(wù)方案(技術(shù)方案)
- 高效能人士的七個(gè)習(xí)慣:實(shí)踐應(yīng)用課程:高級(jí)版
- 小數(shù)加減法計(jì)算題100道
- 通信電子線路(哈爾濱工程大學(xué))智慧樹(shù)知到課后章節(jié)答案2023年下哈爾濱工程大學(xué)
評(píng)論
0/150
提交評(píng)論