Transcript

S

D NG XML TRONG SQL SEVER LI U XML c s d ng l u tr ti li u v cc phn o n XML trong

1. KI U D

- Ki u d li u XML CSDL SQL Server.

- C t c ki u XML khng th nh t. T o cc bi n ki u xml v cc c t

c s d ng lm kha chnh, kha ngo i hay kha duy

Ki u d li u xml l m t ki u d li u gi ng v i cc ki u d li u khc

c tch h p s n trong SQL Sever v c ph n

c tch h p s n nh int hay varchar. C ng nh cc

ki u d li u c s n khc, b n c th s d ng ki u d li u xml nh m t c t d li u khi b n t o m t table nh ki u bi n, tham s , ki u hm tr v ho c trong CAST v CONVERT. V d 1: T o m t c t ki u xml CREATE TABLE Tex1(Col1 int primary key, Col2 xml) V d 2: T o m t bi n c a ki u xml DECLARE @x xml T o m t bi n ki u xml b ng cch ch schema collection) DECLAR @x xml(Sales.StoreSurveyCollection) V d 3: Truy n m t tham s ki u xml t i m t th t c (stored procedure) CREATE PROCEDURE SampleProc(@xmlDoc xml) AS Gn gi tr m c c p xml m c V d 1 nh nh t i 1 c t ki u xml. B n c th cung nh t p h p l c XML (XML

Trong m t Table b n c th gn 1 xml m c nh b ng 1 trong 2 cch sau:

Cung c p XML m c CAST t i ki u xml)

nh nh l m t h ng XML(chu i

c chuy n ng m

nh

CREATE TABLE T (xmlCol xml default N) V d 2: Cung c p XML m c nh nh m t t ng minh CAST t i ki u xml CREATE TABLE T(xmlCol xml default CAST(N) AS xml) Ngoi ra SQL Server c ng h tr rng bu c NULL v NOT NULL tn c t d li u ki u xml V d : CREATE TABLE T (xmlCol xml NOT NULL) Ch nh rng bu c nh m c rng bu c c a Column, Table. Tuy ng th c ki u d di u XML (XML Data Type Methods) thay th l t o ra m t v b c (wrapper), sau nh ngh a (user-defined function) b c cc Khi t o cc c t ki u xml, c th xc nhin, khng th s d ng ph khi ch s ph d ng ch c n ng ng nh rng bu c. Cch khc i dng t

ng th c ki u d li u XML (XML Data Type Methods) trong vi c ki m tra cc nh m i b n XML i dng t c l u tr

rng bu c. V d : Trong v d sau, rng bu c trn c t Col2 quy ProductID. Rng bu c ny trong c t ny ph i c m t thnh ph n ch a thu c tnh c th c thi b ng tnh n ng ng nh ngh a

CREATE FUNCTION myUDF(@var xml) returns bit AS BEGIN RETURN @var.exist(/ProductDescription/@ProductID) END GO L u : ph ng th c exist() c a ki u d li u xml tr v 1 n u thnh ph n c ch a cc thu c tnh ProductID, ng Sau khi t o hm myUDF th c th t o Table c rng bu c. CREATE TABLE T ( Col1 int primary key, Col2 xml check(dbo.myUDF(Col2)=1) GO c l i tr v 0.

Chn d li u thnh cng INSERT INTO T VALUES(1, Do c rng bu c nn cch chn sau y b l i INSERT INTO T VALUES(1, ) Ch nh s a Table S d ng Alter Table CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max)) GO INSERT INTO T VALUES (1, '') GO ALTER TABLE T ALTER COLUMN Col2 xml GO C ng c th thay i m t c t ki u xml t Untyped XML sang Typed XML

CREATE TABLE T (Col1 int primary key, Col2 xml) GO INSERT INTO T VALUES ( 1, ) GO-- Make it a typed xml column by specifying a schema collection.

ALTER TABLE T ALTER GO T o Views

COLUMN Col2 xml ( Production.ProductDescriptionSchemaCollection)

C th s d ng m t c t ki u xml

t o View

--Create the table CREATE TABLE T ( ProductID int primary key, CatalogDescription xml) --Insert sample data INSERT INTO T values(1,'') GO

ProductID="1"

-- Create view (note the value() method used to retrieve ProductName -- attribute value from the XML). CREATE VIEW MyView AS SELECT ProductID, CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName FROM T GO Th c hi n cu l nh truy v n SELECT * FROM MyView K t qu ProductID PName ----------- -----------1 SomeName

2. XML DATA TYPE MEDTHODS a. Query() Method(xml Data Type) S dng ph C php: Query (Xquery) is : Xquery: L m t chu i, m t bi u th c Xquery XML c th l m t ph n t , m t thu c tnh trong V d s d ng: S d ng ph ng th c Query() v i m t bi n ki u XML it truy v n cho cc nt ng th c ny truy v n trn 1 it ng XML

ng XML.

V d sau y khai bo m t bi n @myDoc c a ki u XML v gn m t it ng XML t i n. Truy v n ny l y ra thnh ph n con c a thnh ph n

declare @myDoc xml set @myDoc =' 1 year parts and labor 3 year parts and labor extended maintenance is available ' SELECT @myDoc.query('/Root/ProductDescription/Features') K t qu hi n th : 1 year parts and labor 3 year parts and labor extended maintenance is available

S d ng ph

ng th c Query() v i m t column ki u XML

Theo v d d

i y th ph

ng th c Query

c ch

nh m t Xquery t i

c t CatalogsDescription thu c ki u XML trong CSDL AdvantureWorks SELECT CatalogDescription.query(' declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelDescription"; ')as Result FROM Production.ProductModel where CatalogDescription.exist(' declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelDescription"; declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelWarrAndMain"; /PD:ProductDescription/PD:Features/wm:Warranty ')= 1 K t qu hi n th

b. Value() Method(xml Data Type) Th c hi n m t Xquery th c ny tr v m t gi tr v h Ph t ng XML ng th c ny th ng i v i XML v tr v m t gi tr ki u SQL. Ph ng. c s d ng trch xu t m t gi tr t m t i ng

c l u tr trong c t ki u XML, tham s ho c l bi n. B ng cch ny c k t h p ho c so snh nh ng c t c ki u d li u

th s d ng pht bi u SELECT

XML v i d li u trong nh ng c t khng thu c ki u XML. C php: Value (Xquery,SQLType) is : Xquery: L m t chu i, m t bi u th c Xquery trong it truy v n d li u bn

ng XML. Cc Xquery ph i tr v t nh t 1 gi tr . i dng t nh ngh a

SQLType: L m t ki u ng V d s d ng: S d ng ph

ng th c Value() v i m t bi n ki u XML i y, m t it ng XML c l u tr trong m t bi n

Trong v d d c ki u XML. Ph

ng th c Value() s l y 1 gi tr c a thu c tnh ProductID t c gn cho 1 bi n ki u int.

XML v gi tr ny sau s

DECLARE @myDoc xml DECLARE @ProdID int SET @myDoc =' 1 year parts and labor 3 year parts and labor extended maintenance is available '

SET @ProdID @myDoc.value('(/Root/ProductDescription/@ProductID)[1]','int') SELECT @ProdID K t qu hi n th : Gi tr tr v : 1

=

S d ng ph

ng th c Value() i y

l y v gi tr t m t c t ki u XML nh i v i m t c t d li u ki u xml it ng XML c l u tr

Cc truy v n d

c xc

(CatalogDescription) trong Database AdventureWorks. Truy v n s l y nh ng gi tr c a thu c tnh ProductModelID t nh ng trong c t SELECT CatalogDescription.value(' declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelDescription"; (/PD:ProductDescription/@ProductModelID)[1]','int')AS Result FROM Production.ProductModel WHERE CatalogDescription ISNOTNULL ORDERBY Result desc K t qu hi n th : ----------35 34 ...

S d ng ph ki u XML V d d

ng th c Value() v Exist()

l y v gi tr t

m t c t

i y s d ng c 2 ph ng th c value() XML. Ph

ng th c value() v exist() c a ki u c s d ng l y gi tr thu c tnh WHERE

d li u xml. Ph ProductModelID t c s d ng

ng th c exist() trong m nh

l c ra nh ng dng d li u t table.

SELECT CatalogDescription.value(' declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelDescription"; (/PD:ProductDescription/@ProductModelID)[1] ','int')as Result FROM Production.ProductModel WHERE CatalogDescription.exist(' declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelDescription"; declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelWarrAndMain"; /PD:ProductDescription/PD:Features/wm:Warranty ')= 1 K t qu hi n th : Result ----------19 23 ... S d ng ph ng th c Exist() thay th cho ph ng th c Value() ng th c Value() so snh

t ng hi u su t lm vi c th thay v dng ph v i 1 gi tr quan h th c th s d ng ph sql:column(). V d thay v vi t

ng th c exist() v i c php

CREATETABLE T (c1 int, c2 varchar(10), c3 xml) GO SELECT c1, c2, c3 FROM T WHERE c3.value('/root[1]/@a','integer')= c1 GO

Th c th vi t cu l nh b ng cch ny: SELECT c1, c2, c3 FROM T WHERE c3.exist('/root[@a=sql:column("c1")]')= 1 GO c. Exist() Method(xml Data Type) Ph ng th c Exist s return v 1 trong 2 gi tr i di n sai:

1 (True): N u bi u th c Xquery trong truy v n tr v m t gi tr khc NULL. Ngh a l n tr v t nh t c 1 node XML. 0 (False): N u k t qu l NULL. C php: Exist (Xquery) V d s d ng: Xc nh ph ng th c exist() i v i 1 bi n ki u xml ng th c exist(). Ph c l u tr trong it ng ng

Trong v d d integer

i y, 1 bi n @x ki u xml (untyped xml) v 1 bi n @f ki u l u tr gi tr tr v t ph

c dng

th c exist() s tr v TRUE(1) n u gi tr XML l 2002-01-01

declare @x xml declare @f bit set @x ='' set @f = @x.exist('/root[(@Somedate cast xs:date("2002-01-01Z")]') select @f Xc nh ph ng th c exist() i v i 1 bi n

as

xs:date?)

eq

nh ki u xml (typed xml) ng th c exist() iv im t nh tn l c

Trong v d minh h a c a vi c s d ng ph bi n ki u xml. N l m t bi n Trong v d ny th ph

nh ki u XML, b i v n xc c dng

namespace collection ManuInstructionsSchemaCollection. ng th c exist() tm document no c ph n t c LocationID = 50

DECLARE @x xml(Production.ManuInstructionsSchemaCollection) SELECT @x=Instructions FROM Production.ProductModel WHERE ProductModelID=67 --SELECT @x DECLARE @f int SET @f = @x.exist(' declare namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelManuInstructions"; /AWMI:root/AWMI:Location[@LocationID=50] ') SELECT @f Xc nh ph ng th c exist() i v i 1 c t ki u xml

Cc truy v n d

i y l y v cc ID model s n ph m c danh m c m t

khng bao g m cc chi ti t k thu t: ph n t SELECT ProductModelID, CatalogDescription.query(' declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelDescription"; ')AS Result FROM Production.ProductModel WHERE CatalogDescription.exist(' declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventureworks/ProductModelDescription"; /pd:ProductDescription[not(pd:Specifications)]' )= 1 d. Modify() Method(xml Data Type) Ph Ph ng th c ny dng s a i n i dung c a m t c t ho c m t bi n ki u xml. Insert, Update, Delete cc cs

ng th c ny s d ng m t pht bi u XML DML SET c a pht bi u UPDATE

node t d li u XML. Ph d ng trong m nh C php:

ng th c Modify() c a ki u d li u xml ch c th

Modify (XML_DML)

is : XML_DML: L d ng chu i trong ngn ng thao tc d li u XML (XML Data Manipulation Language (DML)). Ti li u XML d. Nodes() Method(xml Data Type) Ph ng th c ny r t h u d ng khi mu n c t nh m t th lo i d li u xml sang d li u nh cc node m s c s p x p trn m t dng m i. c c p theo bi u th c ny.

quan h . N cho php xc C php:

Nodes (XQuery) as Table(Column) is : XQuery: L d ng chu i trong ngn ng thao tc d li u XML (XML Data Manipulation Language (DML)). Ti li u XML c c p theo bi u th c ny.