For XML子句,和xml的四大法方:query,Value,exist,nodes
使用For XML 子句从数据库获得xml数据
在SQL中使用带for xml子句的select查询,可以从数据库中获得xml数据,根据xml使用模式,返回具有一定格式的xml文档片段。
For XML 子句可以有RAW AUTO EXPLICIT PATH 四种模式
使用RAW模式,for xml 子句查询结果将返回一个属性中心型的xml文档片段:
select * from t1 for xml raw
<row id="1" type="2" value="3" />
...
在for xml raw/auto 后加上elements参数,则返回以元素为中心型的xml文档片段。
select * from t1 for xml raw,elements
<row>
<id>1</id>
<type>2</type>
<value>3</value>
</row>
...
还可以为元素名进行重命名for xml raw("rename")
这样row的名称就会变成rename。
使用Auto模式,和Raw模式相似,但是返回的xml的每一行元素名称有表名代替了raw模式的row,其他的度一样,可以使用elements关键字。
<T1>
<id>1</id>
<type>2</type>
<value>3</value>
</T1>
...
使用path模式,使用示例:
select id as "depart/@id",
name as "depart/name",
degree as "depart/Teacher/degree"
from department
for xml path
这个模式会根据as后面的格式路径返回具体的xml格式,人为控制。
使用cast、convert进行类型转换赋值
declare @myDoc xml
declare @mtstr varchar(500)
set @mtdoc = cast(@mtstr as xml)
set @mtdoc = convert(xml,@mtstr)
xml数据类型的方法:query,Value,exist,nodes
首先定义xml类型变量
declare @x xml
set @x= '<school>
<student>
<no>1</no>
<age>23</age>
</student>
</school>'
示例:query方法,语法格式 @x.query('xquery')
select @x.query('
<student>
{for $st in /school/student
return <name>{data($st/age)}</name>
}
</student>
')
返回结果:
<student>
<name>23</name>
<name>24</name>
...
</student>
示例:value方法,语法格式 @x.value('xquery','sql_type')
1、declare @age int
set @age = @x.value('//age[1]','integer')
2、select domxml.value('(//classroomno)[1]','varchar(4)') as 编号
,domxml.value('(//type)[1]','varchar(4)') as 类型
from classxml
示例:exist方法,若调用exist的xml类型变量为null,则返回null,若xml变量不为null,并且查询的节点存在则返回1,否则返回0.
例如:select * from classxml
where roxml.exist('(//type)[.="mu"]')=1
示例:nodes方法,语法格式 nodes('xquery') as t1(v1)
调用nodes返回对应子元素的行集,其结果存于临时表中。
select stetemp.xmltemp.query('.')
from @x.nodes('/school/student') as stetemp(xmltemp)