SQL 2005引进了XML数据类型,可以直接将XML当作字符串直接存入该列。
这样可以不需要对它进行XML解析。
USE AdventureWorks
-- 创建一个送货排程表
CREATE TABLE Sales.DeliverySchedule
(ScheduleID int IDENTITY PRIMARY KEY,
ScheduleDate DateTime,
DeliveryRoute int,
DeliveryDriver nvarchar(20),
DeliveryList xml)
-- 插入 XML
INSERT INTO Sales.DeliverySchedule
VALUES(GetDate(), 3, 'Alice',
'<?xml version="1.0" ?>
<DeliveryList>
<Delivery SalesOrderID="43659">
<CustomerName>Steve Schmidt</CustomerName>
<Address>6126 North Sixth Street, Rockhampton</Address>
</Delivery>
<Delivery SalesOrderID="43660">
<CustomerName>Tony Lopez</CustomerName>
<Address>6445 Cashew Street, Rockhampton</Address>
</Delivery>
</DeliveryList>')
SELECT * FROM Sales.DeliverySchedule
字段的方法:
value()是取得属性的值、或元素的文本
exist()是判断是否满足某种条件
query()获取子节点本身,返回的就是XML类型的数据
modify()修改- -replace /insert/ delete
modify('replace value of (某节点元素) with "内容"')
node()类似query(),取得子节点,将XML数据转换成表
-- 查询 Delivery 元素
SELECT DeliveryDriver,
DeliveryList.query('/DeliveryList/Delivery') As Deliveries
FROM Sales.DeliverySchedule
-- 查询送货清单中第一个递送的地址,字段名.value( )取的是对应节点的值
--[1]:第一个Address元素
SELECT DeliveryList.value('(/DeliveryList/Delivery/Address)[1]', 'nvarchar(100)') As DeliveryAddress
FROM Sales.DeliverySchedule
WHERE ScheduleID = 1
-- 查找为43659订单送货的送货员是谁?
SELECT DeliveryDriver
FROM Sales.DeliverySchedule
--DeliveryList代表列名
--exist()代表方法
--@代表属性 (@SalesOrderID=43659 )
--1代表true,2代表false
WHERE DeliveryList.exist('/DeliveryList/Delivery[@SalesOrderID=43659]') = 1
-- 更改送货地址
UPDATE Sales.DeliverySchedule
SET DeliveryList.modify
('replace value of (/DeliveryList/Delivery/Address/text())[1]
with "7194 Fourth St. Rockhampton"')
WHERE ScheduleID = 1
可以在XML列上创建XML索引。
联系客服