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)

SỬ DỤNG XML TRONG SQL SEVER

  • Upload
    tam-le

  • View
    494

  • Download
    8

Embed Size (px)

Citation preview

Page 1: SỬ DỤNG XML TRONG SQL SEVER

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ụ

Page 2: SỬ DỤNG XML TRONG SQL SEVER

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

Page 3: SỬ DỤNG XML TRONG SQL SEVER

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

Page 4: SỬ DỤNG XML TRONG SQL SEVER

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ó. ố ượ ớ

Page 5: SỬ DỤNG XML TRONG SQL SEVER

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>

Page 6: SỬ DỤNG XML TRONG SQL SEVER

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ế ả ể ị

Page 7: SỬ DỤNG XML TRONG SQL SEVER

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>'

Page 8: SỬ DỤNG XML TRONG SQL SEVER

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 ...

Page 9: SỬ DỤNG XML TRONG SQL SEVER

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

Page 10: SỬ DỤNG XML TRONG SQL SEVER

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)

Page 11: SỬ DỤNG XML TRONG SQL SEVER

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)

Page 12: SỬ DỤNG XML TRONG SQL SEVER

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.ệ ượ ậ ể ứ