Upload
tam-le
View
494
Download
8
Tags:
Embed Size (px)
Citation preview
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.ệ ượ ậ ể ứ