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)

原文地址:https://www.cnblogs.com/lmfeng/p/2915212.html