SỬ DỤNG XML TRONG SQL SEVER

16
SỬ DỤNG XML TRONG SQL SEVER 1. KIỂU DỮ LIỆU XML - Kiểu dữ liệu XML được sử dụng để lưu trữ tài liệu và các phân đoạn XML trong CSDL SQL Server. - Cột có kiểu XML không thể được sử dụng làm khóa chính, khóa ngoại hay khóa duy nhất. Tạo các biến kiểu xml và các cột Kiểu dữ liệu xml là một kiểu dữ liệu được tích hợp sẵn trong SQL Sever và có phần giống với các kiểu dữ liệu khác được tích hợp sẵn như int hay varchar. Cũng như các kiểu dữ liệu có sẵn khác, 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 hàm trả về hoặc trong CAST 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 cách chỉ định tập hợp lược đồ XML (XML 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)

Transcript of SỬ DỤNG XML TRONG SQL SEVER

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.