Sql Server2005 XML体验

本文详细介绍了在SQL Server 2005中如何操作XML,包括创建XML列和变量,无类型与类型化XML的区别,XML模式的创建与应用,以及XML数据的查询、修改和索引方法。示例代码展示了如何插入、删除、修改XML数据,以及创建XML索引来提升查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Sql Server.2005 XML体验

XML列与XML变量
1.
创建一个带XML列的表

Create table dbo.XmlTest(XmlTestID int,XmlTestName varchar(50),XmlTestMemo XML)

2.
XML表里插入数据
Insert into dbo.XmlTest     values(100,'Name1','<ROOT><XmlTest>300,zhuhui  street, Suzhou </XmlTest></ROOT>')

插入一个非法的XML,系统将会报错:


Insert into dbo.XmlTest values(1,' Name1','<ROOT><XmlTest>300,zhuhui  street,Suzhou ')
消息9400,级别16,状态1,第1

XML 分析: 1,字符41,意外的输入结尾

3 创建XML变量
Declare @xml xml

  无类型与类型化XML

无类型xml

xml文档不和任何模式关联,能以任何形式存储. 当我们向一个xml列插入数据时,应该有一个检查去判断插入的数据是否符合xml规范.

类型化

xml xml列与xml模式相关联,优点是 sql server会自动用模式来验证xml的有效性, xml占用的存储空间少,广域元素和属性的类型信息都由模式提供.

Xml模式

 1.  xml的模式须先存在库里,然后创建xml数据类型时提供schema用于对照数据格式,这就是类型化的xml

xml模式可以用下面的方法定义
CREATE XML SCHEMA COLLECTION [ <relational_schema>. ]sql_identifier AS Expression

·      Schema名称,未定义的话,就用缺省的schema

·      xml schema集合的sql标识

·      表达式,是字符串常量或变量,可以是如下类型 varchar, varbinary,       nvarchar, nvarbinary, or xml type.

示例创建xml模式集合


CREATE XML SCHEMA COLLECTION Xmltestschema AS '

<schema xmlns="http://www.w3.org/2001/XMLSchema">

<element name="root">

<complexType>

<sequence>

<element name="StreetName" type="string"/>

<element name="Company" type="string"/>

</sequence>

</complexType>

</element>

</schema>'

xml schema归档后,可通过xml_schema_namespace函数取的xml 数据类型实例


SELECT xml_schema_namespace(N'dbo',N'Xmltestschema')
结果如下

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element name="root"><xsd:complexType><xsd:complexContent><xsd:restriction base="xsd:anyType"><xsd:sequence><xsd:element name="StreetName" type="xsd:string" /><xsd:element name="Company" type="xsd:string" /></xsd:sequence></xsd:restriction></xsd:complexContent></xsd:complexType></xsd:element></xsd:schema>

  2.xml
模式创建后,可以在创建数据表或声明xml 变量时使用


1)
声明xml变量

Declare @xml xml(Xmltestschema)

set @xml='<root><StreetName> Zhuhui Road </StreetName><Company>Telecom</Company></root>'

 

2) 插入数据

Insert into dbo.XmlTest (XmlTestID,XmlTestName,XmlTestMemo)

values ('1','Test01','<root><StreetName> Zhuhui Road </StreetName><Company>Telecom</Company></root>')

 

查询xml数据

查询方法如下

1) 序列方法。此方法返回无类型xml的片段。下例返回xml列里的一个值
示例
select XmlTestMemo.query('/root/StreetName') from XmlTest

结果

返回部分数据集,但是无类型xml的片段
<StreetName>Zhuhui Road</StreetName>

2) 取值方法。类似于查询方法。唯一的区别是取值方法可以接受额外一个决定返回数据类型的参数:


select XmlTestMemo.value('(/root/StreetName)[1]','varchar(50)') from XmlTest

结果

Zhuhui Road

3)方法三:存在方法。取一个表达式作为输入,在xml文本中查询一个特定节点,如存在则返回1,不存在返回0



select XmlTestMemo.exist('/root/StreetName') from XmlTest

上述查询返回xmltest表中所有含StreetName的行。
结果

1


存在方法可用于where子句

select * from Xmltest

Where XmlTestMemo.exist('/root/StreetName')=1

4)修改方法 表中存储的xml数据可用如下子方法修改值:

·     INSERT 插入

·     DELETE 删除

·     REPLACE替代

Example:
delete方法

declare @x xml

declare @custid int

set @x='<root>

<CompanyDescription CompamyID="001" CompanyName="Telecom">

<Phonenumber>

<WorkPlace>68302239</WorkPlace>

<Mobile>1360613666666</Mobile>

</Phonenumber>

</CompanyDescription>

<CompanyDescription CompamyID="002" CompanyName="Power">

<Phonenumber>

<WorkPlace>69891111</WorkPlace>

<Mobile>13338999909</Mobile>

</Phonenumber>

</CompanyDescription>

</root>'

select @x

结果

<root>

  <CompanyDescription CompamyID="001" CompanyName="Telecom">

    <Phonenumber>

      <WorkPlace>68302239</WorkPlace>

      <Mobile>1360613666666</Mobile>

    </Phonenumber>

  </CompanyDescription>

  <CompanyDescription CompamyID="002" CompanyName="Power">

    <Phonenumber>

      <WorkPlace>69891111</WorkPlace>

      <Mobile>13338999909</Mobile>

    </Phonenumber>

  </CompanyDescription>

</root>

set @x.modify('delete /root/CompanyDescription/@CompamyID')

select @x

结果

<root>

  <CompanyDescription CompanyName="Telecom">

    <Phonenumber>

      <WorkPlace>68302239</WorkPlace>

      <Mobile>1360613666666</Mobile>

    </Phonenumber>

  </CompanyDescription>

  <CompanyDescription CompanyName="Power">

    <Phonenumber>

      <WorkPlace>69891111</WorkPlace>

      <Mobile>13338999909</Mobile>

    </Phonenumber>

  </CompanyDescription>

</root>


insert 方法  插入xml片段,可使用insert语句
Example:

DECLARE @x xml      

SET @x = '<Root>      

<CompanyDescription CompanyID="001" CompanyName="Telecom">      

<Phonenumber>       

</Phonenumber>      

</CompanyDescription>      

</Root>'      

SELECT @x   

结果  

<Root>

  <CompanyDescription CompanyID="001" CompanyName="Telecom">

    <Phonenumber />

  </CompanyDescription>

</Root>

 

SET @x.modify('      

insert <WorkPlac>141717</WorkPlac>

into (/Root/CompanyDescription/Phonenumber)[1]')

SELECT @x

 Result:结果

<Root>

  <CompanyDescription CompanyID="001" CompanyName="Telecom">

    <Phonenumber>

      <WorkPlac>141717</WorkPlac>

    </Phonenumber>

  </CompanyDescription>

</Root>

5)节点方法。节点方法可用来从xml文档中取得数据生成用于诸如创建新内容或插入新建表格里的内容的子节点
Example:


declare @x xml

set @x='<Root><row id="1"><CompanyId>001</CompanyId><CompanyName>Mumbai</CompanyName></row>

<row id="2"><CompanyId>002</CompanyId><CompanyName> Madras </CompanyName></row>

<row id="3"></row></Root>'

Select T.c.query('.') as result

from @x.nodes('/Root/row') T(c)

结果

<row id="1"><CompanyId>001</CompanyId><CompanyName>Mumbai</CompanyName></row>

<row id="2"><CompanyId>002</CompanyId><CompanyName> Madras </CompanyName></row>

<row id="3"></row>

 

xml索引

xml索引可加快xml数据的查询。Xml索引分为如下类型:
1)
xml索引
2)
xml索引

xml列上的第一个索引必须是主xml索引。有了主xml索引,可使用下列二级索引:pathvalueproperty。取决于查询的类别,二级索引可能会改善查询效率。

() xml索引
 
Xml列的每一个xml二进制对象,索引生成几行数据。索引中的行数大致等于xml对象里的节点数。

 每一行存储了一下信息:

1.   元素或属性名

2.   节点值

3.   节点类型,例如元素节点,属性节点,或文本节点

4.  由内部节点号代表德文档顺序信息

5.   从此节点到根节点的路径。可以用于路径查询

6.   基本表的主键

示例

 

Create table dbo.XmlTest(

XmlTestID int,

XmlTestName varchar(50),

XmlTestMemo XML

CONSTRAINT [PK_Testid] PRIMARY KEY CLUSTERED

( XmlTestID ASC

)

)

 

go

Create Primary XML INDEX Prim_XmlTestMemo ON XmlTest(XmlTestMemo)

 

()xml索引

为增强查询效率,可创建二级索引。但必须先创建主索引。以下是从索引的类型:

·     路径从xml索引。如果查询是基于路径,路经二级索引可增加速度。如果你有含exist方法的where子句的查询,路经二级索引会有帮助。

示例

 

Create XML INDEX Second_XmlTestMemo ON XmlTest(XmlTestMemo)

USING XML INDEX Prim_XmlTestMemo

FOR PATH

·      值从索引。如果查询是基于值,且路径未指定或含通配符,我们可以建基于主索引节点值的二级索引以加快查询。

   

Create XML INDEX Value_XmlTestMemo ON XmlTest(XmlTestMemo)

USING XML INDEX Prim_XmlTestMemo

FOR VALUE

·     属性从索引。从单个xml实例返回一个或多个值的查询可受益于属性二级索引。适用于当使用xml类型的value方法获得对象属性,且对象的主键值已知。

:       

Create XML INDEX Property_XmlTestMemo ON XmlTest(XmlTestMemo)

USING XML INDEX Prim_XmlTestMemo

FOR PROPERTY

   

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值