SQL Server 2005引入了原生的XML数据类型与相关的XML支持。
关系数据库的XML支持
关系数据库为什么需要支持XML呢?随着XML的使用越来越广泛,人们对XML的储存、分析、处理都有了更加快速、更加方便的要求。将XML数据类型整合到数据库中便可以解决这个问题。
- 关系模型是否被抛弃了呢?
XML序列数据库中的对象
我们可以直接在SQL Server中使用XML对象,例如:
CREATE TABLE dbo.VisioDocs
(
id INT NOT NULL,
doc XML NOT NULL
);
GO
我还可以很方便地将XML的文件插入数据库中,例如:
INSERT INTO dbo.VisioDocs (id, doc)
SELECT 1, *
FROM OPENROWSET(BULK 'C:\VisioFiles\ProductORM.vdx', SINGLE_BLOB) AS x;
当你执行搜索的时候,SQL Server会列出文件的地址:
SELECT id, doc FROM dbo.VisioDocs;
ID | Doc |
1 | <VisioDocument xmlns="http://schemas.microsoft.co… |
当然,你也可以直接利用SQL语言来查询XML中的内容:
- value函数
SELECT id, doc.value('declare namespace VI= "http://schemas.microsoft.com/visio/2003/core"; (/VI:VisioDocument/VI:DocumentProperties/VI:Company)[1]', 'NVARCHAR(50)') AS company
FROM dbo.VisioDocs;
ID | Doc |
1 |
Solid Quality Learning |
可以看出,value函数支持XQuery的表达式。第一部分声明namespaces,第二部分表示数据的路径。需要注意,上述表达式中存在一个[1]。因为未定义框架的XML是可以在同一级包含两个名称,因此需要使用序号来将数组转换成为一个单一的值。
- query函数
SELECT doc.query(' declare namespace VI="http://schemas.microsoft.com/visio/2003/core"; for $v in /VI:VisioDocument/VI:DocumentSettings return $v') AS settingsFROM dbo.VisioDocs;
settings |
<VI:DocumentSettings xmlns:VI="http://schemas.microsoft.co… |
当你单击上面的链接时,具体的内容将被显示出来:
<VI:DocumentSettings xmlns:VI="http://schemas.microsoft.com/visio/2003/core" TopPage="0" DefaultTextStyle="3" DefaultLineStyle="3" DefaultFillStyle="3"DefaultGuideStyle="4">
<VI:GlueSettings>9</VI:GlueSettings>
<VI:SnapSettings>39</VI:SnapSettings>
<VI:SnapExtensions>34</VI:SnapExtensions>
<VI:DynamicGridEnabled>0</VI:DynamicGridEnabled>
<VI:ProtectStyles>0</VI:ProtectStyles>
<VI:ProtectShapes>0</VI:ProtectShapes>
<VI:ProtectMasters>0</VI:ProtectMasters>
<VI:ProtectBkgnds>0</VI:ProtectBkgnds>
</VI:DocumentSettings>
并且,利用return语句可以定义返回的XML结构。例如,下面的表达式中返回了一个自定义类型的XML值
SELECT doc.query('
declare namespace VI="http://schemas.microsoft.com/visio/2003/core";
for $v in /VI:VisioDocument/VI:DocumentProperties
return element Person
{
attribute creatorname
{$v/VI:Creator[1]/text()[1]}
}')
FROM dbo.VisioDocs;
返回值的第一行为<Person creatorname="Dejan Sarka" />
- nodes函数
- XML索引
- 位置(Path):用于主要搜索位置表达式,适用于.exist方法。
- 值(Value):用于基于值的搜索。
- 属性(Property):用于从单一XML实例中提取多个值,适用于.queries方法。
利用XML实现开放模式
(
ID NVARCHAR(15),
ForeignLanguage NVARCHAR(50)
);
CREATE TABLE dbo.Foreigns
(
NativeLanguage NVARCHAR(50),
SpeaksEnglish BIT
);
GO
-- Store the Schemas in a Variable and Create the Collection
DECLARE @mySchema NVARCHAR(MAX);
SET @mySchema = N'';
SET @mySchema = @mySchema +
(SELECT *
FROM Domestic
FOR XML AUTO, ELEMENTS, XMLSCHEMA('Domestic'));
SET @mySchema = @mySchema +
(SELECT *
FROM Foreigns
FOR XML AUTO, ELEMENTS, XMLSCHEMA('Foreign'));
-- Create Schema Collection
CREATE XML SCHEMA COLLECTION dbo.ContactOtherAttributes AS @mySchema;
GO
-- Drop Tables
DROP TABLE dbo.Domestic, dbo.Foreigns;
ALTER COLUMN otherattributes XML(dbo.ContactOtherAttributes);
<Domestic xmlns="Domestic">
<ID>012345678901234</ID>
<ForeignLanguage>Spanish</ForeignLanguage>
</Domestic>');
INSERT INTO dbo.Contacts VALUES(2, N'Herbert', 0, N'
<Foreigns xmlns="Foreign">
<NativeLanguage>German</NativeLanguage>
<SpeaksEnglish>1</SpeaksEnglish>
</Foreigns>');
SET @inplist=
(SELECT * FROM
(SELECT N'Gianluca' AS NameNeeded
UNION ALL
SELECT N'Mike') AS D
FOR XML RAW('Names'), ELEMENTS);
EXEC dbo.GetContacts @inplist;
尽管W3C不支持XQuery,SQL Server 2005还是扩展了他自己的语法来支持对XML数据类型地局部修改。XQuery支持如下的关键字:
- insert
- delete
- replace value of
UPDATE dbo.Contacts
SET otherattributes.modify('
declare namespace D="Domestic";
insert <D:Hobbie>Cigar</D:Hobbie>
into /D:Domestic[1]')
WHERE contactid = 1;
-- Delete 2nd language for Kalen
UPDATE dbo.Contacts
SET otherattributes.modify('
declare namespace D="Domestic";
delete /D:Domestic/D:ForeignLanguage[2]')
WHERE contactid = 5;
-- change the value of an element
UPDATE dbo.Contacts
SET otherattributes.modify('
declare namespace D="Domestic";
replace value of
/D:Domestic[1]/D:ForeignLanguage[1]/text()[1]
with "Russian" ')
WHERE contactid = 3;