sỬ dỤng xml trong sql sever

Post on 25-Oct-2014

494 Views

Category:

Documents

8 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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 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 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)ề ộ ố ể ớ ộ ủ ụ

CREATE PROCEDURE SampleProc(@xmlDoc xml) AS

Gán giá tr m c đ nhị ặ ị

Trong m t Table b n có th gán 1 xml m c đ nh t i 1 c t ki u xml. B n có thộ ạ ể ặ ị ớ ộ ể ạ ể

cung c p xml m c đ nh b ng 1 trong 2 cách sau:ấ ặ ị ằ

Ví d 1ụ

Cung c p XML m c đ nh nh là m t h ng XML(chu i đ c chuy n ng mấ ặ ị ư ộ ằ ỗ ượ ể ầ

đ nh CAST t i ki u xml)ị ớ ể

CREATE TABLE T (xmlCol xml default N‘<element1/><element2/>’)

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‘<ele1/><ele2/>’) AS xml)

Ngoài ra SQL Server cũng h tr ràng bu c NULL và NOT NULL tên c t dỗ ợ ộ ộ ữ

li u ki u xmlệ ể

Ví d : ụ CREATE TABLE T (xmlCol xml NOT NULL)

Ch đ nh ràng bu cỉ ị ộ

Khi t o các c t ki u xml, có th xác đ nh m c đ ràng bu c c a Column, Table.ạ ộ ể ể ị ứ ộ ộ ủ

Tuy nhiên, không th s d ng ph ng th c ki u d di u XML (XML Data Typeể ử ụ ươ ứ ể ữ ệ

Methods) khi ch đ nh ràng bu c. Cách khác đ thay th là t o ra m t v b cỉ ị ộ ể ế ạ ộ ỏ ọ

(wrapper), sau đó s d ng ch c năng ng i dùng t đ nh nghĩa (user-definedử ụ ứ ườ ự ị

function) đ b c các ph ng th c ki u d li u XML (XML Data Type Methods)ể ọ ươ ứ ể ữ ệ

trong vi c ki m tra các ràng bu c.ệ ể ộ

Ví d :ụ Trong ví d sau, ràng bu c trên c t Col2 quy đ nh m i b n XML đ c l uụ ộ ộ ị ỗ ả ượ ư

tr trong c t này ph i có m t thành ph n <ProductDescription> ch a thu c tínhữ ộ ả ộ ầ ứ ộ

ProductID. Ràng bu c này đ c th c thi b ng tính năng ng i dùng t đ nhộ ượ ự ằ ườ ự ị

nghĩa

CREATE FUNCTION myUDF(@var xml) returns bitAS BEGINRETURN @var.exist(‘/ProductDescription/@ProductID’)ENDGO

L u ý: ư ph ng th c exist() c a ki u d li u xml tr v 1 n u thành ph nươ ứ ủ ể ữ ệ ả ề ế ầ

<ProductDescription> có ch a các thu c tính ProductID, ng c l i tr v 0.ứ ộ ượ ạ ả ề

Sau khi t o hàm myUDF thì có th t o Table có ràng bu c.ạ ể ạ ộ

CREATE TABLE T (Col1 int primary key,Col2 xml check(dbo.myUDF(Col2)=1)

GO

Chèn d li u thành côngữ ệ

INSERT INTO T VALUES(1, ‘<ProductDescription ProductID= “1”/>

Do có ràng bu c nên cách chèn sau đây b l iộ ị ỗ

INSERT INTO T VALUES(1, ‘<ProductID />’)

Ch nh s a Tableỉ ử

S d ng Alter Tableử ụ

CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))GOINSERT INTO T VALUES (1, '<Root><Product ProductID="1"/></Root>')GOALTER TABLE T ALTER COLUMN Col2 xmlGO

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)GOINSERT INTO T VALUES (

1, ‘<p1:ProductDescription ProductModeID= “1”xmlns:p1= http://schemas.microsoft.com/sqlsever/2004/07/a

dventure-works/ProductModeDescription></p1 :ProductDescription>’)

GO-- Make it a typed xml column by specifying a schema collection.ALTER TABLE TALTER COLUMN Col2 xml (

Production.ProductDescrip tionSchemaCollection)GO

T o Viewsạ

Có th s d ng m t c t ki u xml đ t o Viewể ử ụ ộ ộ ể ể ạ

--Create the tableCREATE TABLE T (

ProductID int primary key,CatalogDescription xml)

--Insert sample data

INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')

GO-- 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 TGO

Th c hi n câu 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 dùng ph ng th c này đ truy v n trên 1 đ i t ng XMLử ươ ứ ể ấ ố ượ

Cú pháp:

Query (‘Xquery’)

Đ i s :ố ố

Xquery: Là m t chu i, m t bi u th c Xquery đ truy v n cho cácộ ỗ ộ ể ứ ể ấ

nút XML đó có th là m t ph n t , m t thu c tính trong đ i t ng XML.ể ộ ầ ử ộ ộ ố ượ

Ví d s d ng:ụ ử ụ

S d ng ph ng th c Query() v i m t bi n ki u XMLử ụ ươ ứ ớ ộ ế ể

Ví d sau đây khai báo m t bi n @myDoc c a ki u XML và gán m tụ ộ ế ủ ể ộ

đ i t ng XML t i nó. ố ượ ớ

Truy v n này l y ra thành ph n con <Features> c a thành ph nấ ấ ầ ủ ầ

<ProductDescription>

declare @myDoc xmlset @myDoc = '<Root>

<ProductDescription ProductID="1" ProductName="Road Bike"><Features>

<Warranty>1 year parts and labor</Warranty> <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>

</Features></ProductDescription></Root>'

SELECT @myDoc.query('/Root/ProductDescription/Features')

K t qu hi n th :ế ả ể ị

<Features> <Warranty>1 year parts and labor</Warranty>

<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>

</Features>

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/adventure-works/ProductModelDescription";<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />') as ResultFROM Production.ProductModelwhere CatalogDescription.exist('declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/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 đ i v i XML và tr v m t giá tr ki u SQL. Ph ngự ệ ộ ố ớ ả ề ộ ị ể ươ

th c này tr v m t giá tr vô h ng.ứ ả ề ộ ị ướ

Ph ng th c này th ng đ c s d ng đ trích xu t m t giá tr t m tươ ứ ườ ượ ử ụ ể ấ ộ ị ừ ộ

đ i t ng XML đ c l u tr trong c t ki u XML, tham s ho c là bi n. B ngố ượ ượ ư ữ ộ ể ố ặ ế ằ

cách này có th s d ng phát bi u SELECT đ k t h p ho c so sánh nh ng c tể ử ụ ể ể ế ợ ặ ữ ộ

có ki u d li u XML v i d li u trong nh ng c t không thu c ki u XML.ể ữ ệ ớ ữ ệ ữ ộ ộ ể

Cú pháp:

Value (Xquery,SQLType)

Đ i s :ố ố

Xquery: Là m t chu i, m t bi u th c Xquery đ truy v n d li uộ ỗ ộ ể ứ ể ấ ữ ệ

bên trong đ i t ng XML. Các Xquery ph i tr v ít nh t 1 giá tr .ố ượ ả ả ề ấ ị

SQLType: Là m t ki u ng i dùng t đ nh nghĩaộ ể ườ ự ị

Ví d s d ng:ụ ử ụ

S d ng ph ng th c Value() v i m t bi n ki u XMLử ụ ươ ứ ớ ộ ế ể

Trong ví d d i đây, m t đ i t ng XML đ c l u tr trong m tụ ướ ộ ố ượ ượ ư ữ ộ

bi n có ki u XML. Ph ng th c Value() sẽ l y 1 giá tr c a thu c tínhế ể ươ ứ ấ ị ủ ộ

ProductID t XML và giá tr này sau đó sẽ đ c gán cho 1 bi n ki u int.ừ ị ượ ế ể

DECLARE @myDoc xmlDECLARE @ProdID intSET @myDoc = '<Root><ProductDescription ProductID="1" ProductName="Road Bike"><Features> <Warranty>1 year parts and labor</Warranty> <Maintenance>3 year parts and labor extended maintenance is available</Maintenance></Features></ProductDescription></Root>'

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() đ l y v giá tr t m t c t ki uử ụ ươ ứ ể ấ ề ị ừ ộ ộ ể

XML

Các truy v n d i đây đ c xác đ nh đ i v i m t c t d li u ki uấ ướ ượ ị ố ớ ộ ộ ữ ệ ể

xml (CatalogDescription) trong Database AdventureWorks. Truy v n sẽ l yấ ấ

nh ng giá tr c a thu c tính ProductModelID t nh ng đ i t ng XMLữ ị ủ ộ ừ ữ ố ượ

đ c l u tr trong c tượ ư ữ ộ

SELECT CatalogDescription.value(' declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result FROM Production.ProductModel WHERE CatalogDescription IS NOT NULL

ORDER BY Result desc

K t qu hi n th :ế ả ể ị

-----------35 34 ...

S d ng ph ng th c Value() và Exist() đ l y v giá tr t m tử ụ ươ ứ ể ấ ề ị ừ ộ

c t ki u XMLộ ể

Ví d d i đây s d ng c 2 ph ng th c ụ ướ ử ụ ả ươ ứ value() và exist()

c a ki u d li u xml. Ph ng th c ủ ể ữ ệ ươ ứ value() đ c s d ng đ l y giáượ ử ụ ể ấ

tr thu c tính ProductModelID t XML. Ph ng th c ị ộ ừ ươ ứ exist() trong

m nh đ ệ ề WHERE đ c s d ng đ l c ra nh ng dòng d li u t table.ượ ử ụ ể ọ ữ ữ ệ ừ

SELECT CatalogDescription.value(' declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; (/PD:ProductDescription/@ProductModelID)[1] ', 'int') as ResultFROM Production.ProductModelWHERE CatalogDescription.exist(' declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

/PD:ProductDescription/PD:Features/wm:Warranty ') = 1K t qu hi n th :ế ả ể ị

Result -----------

19 23 ...

S d ng ph ng th c Exist() thay th cho ph ng th c Value()ử ụ ươ ứ ế ươ ứ

Đ tăng hi u su t làm vi c thì thay vì dùng ph ng th c Value() đ soể ệ ấ ệ ươ ứ ể

sánh v i 1 giá tr quan h thì có th s d ng ph ng th c exist() v iớ ị ệ ể ử ụ ươ ứ ớ

cú pháp sql:column(). Ví d thay vì vi tụ ế

CREATE TABLE T (c1 int, c2 varchar(10), c3 xml)GO

SELECT c1, c2, c3 FROM TWHERE c3.value( '/root[1]/@a', 'integer') = c1GO

Thì có th vi t câu l nh b ng cách này:ể ế ệ ằSELECT c1, c2, c3 FROM TWHERE c3.exist( '/root[@a=sql:column("c1")]') = 1GO

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 khácế ể ứ ấ ả ề ộ ị

NULL. Nghĩa là nó tr v ít nh t có 1 node XML.ả ề ấ

0 (False): N u k t qu là NULL. ế ế ả

Cú pháp:

Exist (Xquery)

Ví d s d ng:ụ ử ụ

Xác đ nh ph ng th c exist() đ i v i 1 bi n ki u xmlị ươ ứ ố ớ ế ể

Trong ví d d i đây, 1 bi n @x ki u xml (untyped xml) và 1 bi n @fụ ướ ế ể ế

ki u integer đ c dùng đ l u tr giá tr tr v t ph ng th cể ượ ể ư ữ ị ả ề ừ ươ ứ

exist(). Ph ng th c exist() sẽ tr v TRUE(1) n u giá tr đ c l u trươ ứ ả ề ế ị ượ ư ữ

trong đ i t ng XML là 2002-01-01ố ượ

declare @x xmldeclare @f bitset @x = '<root Somedate = "2002-01-01Z"/>'set @f = @x.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2002-01-01Z")]')select @f

Xác đ nh ph ng th c exist() đ i v i 1 bi n đ nh ki u xml (typedị ươ ứ ố ớ ế ị ể

xml)

Trong ví d minh h a c a vi c s d ng ph ng th c exist() đ i v iụ ọ ủ ệ ử ụ ươ ứ ố ớ

m t bi n ki u xml. Nó là m t bi n đ nh ki u XML, b i vì nó xác đ nhộ ế ể ộ ế ị ể ở ị

tên l c đ namespace collection ManuInstructionsSchemaCollection.ượ ồ

Trong ví d này thì ph ng th c exist() đ c dùng đ tìm documentụ ươ ứ ượ ể

nào có ph n t <Location> có LocationID = 50ầ ử

DECLARE @x xml (Production.ManuInstructionsSchemaCollection)SELECT @x=InstructionsFROM Production.ProductModelWHERE ProductModelID=67--SELECT @xDECLARE @f intSET @f = @x.exist(' declare namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"; /AWMI:root/AWMI:Location[@LocationID=50]')SELECT @f

Xác đ nh ph ng th c exist() đ i v i 1 c t ki u xmlị ươ ứ ố ớ ộ ể

Các truy v n d i đây l y v các ID model s n ph m có danh m c môấ ướ ấ ề ả ẩ ụ

t không bao g m các chi ti t kỹ thu t: ph n t <ả ồ ế ậ ầ ử Specifications>

SELECT ProductModelID, CatalogDescription.query('declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; <Product ProductModelID= "{ sql:column("ProductModelID") }" />') AS ResultFROM Production.ProductModelWHERE CatalogDescription.exist(' declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; /pd:ProductDescription[not(pd:Specifications)]' ) = 1

d. Modify() Method(xml Data Type)

Ph ng th c này dùng đ s a đ i n i dung c a m t c t ho c m t bi n ki uươ ứ ể ử ổ ộ ủ ộ ộ ặ ộ ế ề

xml. Ph ng th c này s d ng m t phát bi u XML DML đ Insert, Update,ươ ứ ử ụ ộ ể ể

Delete các node t d li u XML. Ph ng th c Modify() c a ki u d li u xml chừ ữ ệ ươ ứ ủ ể ữ ệ ỉ

có th đ c s d ng trong m nh đ SET c a phát bi u UPDATEể ượ ử ụ ệ ề ủ ể

Cú pháp:

Modify (XML_DML)

Đ i s :ố ố

XML_DML: Là d ng chu i trong ngôn ng thao tác d li u XML (XML Dataạ ỗ ữ ữ ệ

Manipulation Language (DML)). Tài li u XML đ c c p theo bi u th c này.ệ ượ ậ ể ứ

d. Nodes() Method(xml Data Type)

Ph ng th c này 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 quan h . Nó cho phép xác đ nh các node mà sẽ đ c s p x p trên m tữ ệ ệ ị ượ ắ ế ộ

dòng m i.ớ

Cú pháp:

Nodes (XQuery) as Table(Column)

Đ i s :ố ố

XQuery: Là d ng chu i trong ngôn ng thao tác d li u XML (XML Dataạ ỗ ữ ữ ệ

Manipulation Language (DML)). Tài li u XML đ c c p theo bi u th c này.ệ ượ ậ ể ứ

top related