raw情势将查询效果集合的每一行转换为带有<row>元素称号的xml元素,将每一行的列转换为row的属性.
能够经由过程编写嵌套FOR XML查询来生成XML条理构造
在默许情况下,一切非null值都将被映照为<row>元素的属性.
假如须要将查询效果集合数据转换为<row>元素的子元素,须要运用elements指令.
语法:
FOR XML RAW [ ('ElementName') ] [ <CommonDirectives> [ , { XMLDATA | XMLSCHEMA [ ('TargetNameSpaceURI') ]} ] [ , ELEMENTS [ XSINIL | ABSENT ] ] <CommonDirectives> ::= [ , BINARY BASE64 ] [ , TYPE ] [ , ROOT [ ('RootName') ] ]
细致拜见例子:
建表Base,表构造以下:
列名 数据范例 许可空 id int 许可 body nvarchar(50) 许可 插进去表数据以下:
id body 1 aaaa 2 bbbb 3 cccc 4
例句:
A.返回查询数据的信息,运用for xml raw 情势
/* 效果: <row id="1" body="aaaa" /> <row id="2" body="bbbb" /> <row id="3" body="dddd" /> <row id="4" /> */select * from base for xml raw;
经由过程指定ELEMENTS指令使效果集以子元素的情势涌现.
/* 效果: <row> <id>1</id> <body>aaaa</body> </row> <row> <id>2</id> <body>bbbb</body> </row> <row> <id>3</id> <body>dddd</body> </row> <row> <id>4</id> </row> */select * from base for xml raw,elements;
我们注意到这个例句中没有将id为4的body显现涌现.
缘由是由于,在运用elements指令时,假如没有指定背面的敕令,则默许运用abscent,此时不会为null值建立任何元素.
鄙人面的例句中经由过程运用elements xsinil可以使null值显如今xml中.
B.同时指定elements指令和xsinil指令以生产null列值的元素
/* 效果: <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>1</id> <body>aaaa</body> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>2</id> <body>bbbb</body> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>3</id> <body>dddd</body> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>4</id> <body xsi:nil="true" /> </row> */select * from base for xml raw,elements xsinil;
关于每条数据都是以<row>元素显现会让人看起来很不惬意,怎样修正<row>元素称号为其他称号呢.
C.重命名<row>元素
/* 效果: <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>1</id> <body>aaaa</body> </baseinfo> <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>2</id> <body>bbbb</body> </baseinfo> <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>3</id> <body>dddd</body> </baseinfo> <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>4</id> <body xsi:nil="true" /> </baseinfo> */select * from base for xml raw('baseinfo'),elements xsinil;
我们都晓得,每一个xml文件都有一个根元素,我们怎样为这段xml文本加上它的根元素呢.
D.为for xml生成的xml指定根元素
可运用root指定,root指令的默许根元素为<root>
/* 效果: <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <baseinfo> <id>1</id> <body>aaaa</body> </baseinfo> <baseinfo> <id>2</id> <body>bbbb</body> </baseinfo> <baseinfo> <id>3</id> <body>dddd</body> </baseinfo> <baseinfo> <id>4</id> <body xsi:nil="true" /> </baseinfo> </base> */select * from base for xml raw('baseinfo'),root('base'),elements xsinil;
如今看起来,生成的xml效果好像很不错,然则,假如我们想要将数据库中的body列改成xml的<data>元素,该怎样修正呢?
E.修正元素名
/* 效果: <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <baseinfo> <id>1</id> <data>aaaa</data> </baseinfo> <baseinfo> <id>2</id> <data>bbbb</data> </baseinfo> <baseinfo> <id>3</id> <data>dddd</data> </baseinfo> <baseinfo> <id>4</id> <data xsi:nil="true" /> </baseinfo> </base> */select id,body data from base for xml raw('baseinfo'),root('base'),elements xsinil;
如今的效果,基础上相符一个xml的基础花样,那末,我们想象,假如不给id,body指定列名,也不指定根元素名,也不指定元素名,那会涌现什么记过呢?
/* 效果: 1aaaa2bbbb3dddd4 */ --由于id为int范例,为使id不涌现列名,我们使id+0 --由于body为nvarchar范例,为使body不涌现列名,我们使body+''select id+0,body+'' from base for xml raw(''), elements;然则,对上面的效果,我们好像没法分清晰每条数据,而且id为4的空值也没有显现出来,怎样举行修正呢?见下句.
/* 效果: 1,aaaa;2,bbbb;3,dddd;4,null; */select id+0,',',isnull(body,'null')+'',';' from base for xml raw(''),elements;云云以来,好像看到了没有列名给我们带的优点.实在上句还能够再修正些.
/* 效果: 1,aaaa;2,bbbb;3,dddd;4,null; */select convert(nvarchar,id)+','+isnull(body,'null')+';' from base for xml raw(''),elements;
我们再来修正,让让效果以另一种体式格局涌现.
/* 效果: {1,aaaa}{2,bbbb}{3,dddd}{4,null} */select '{'+convert(nvarchar,id)+','+isnull(body,'null')+'}' from base for xml raw(''),elements;
如今能够看到,我们能够依据本身的须要举行组合,生成我们须要的效果.
在SQLServer2005中,已支撑了xml数据范例,因而,能够经由过程编写TYPE指令,将FOR XML查询的效果以xml数据范例举行返回,举例以下:
declare @string nvarchar(1000)declare @xml xml/* 音讯257,级别16,状况3,第8行 不许可从数据范例xml到nvarchar的隐式转换。请运用CONVERT函数来运转此查询。 */ --set @string=(select id,body from base for xml raw,type)set @xml=(select id,body from base for xml raw,type)
末了,以一个经常使用的例子来引见for xml raw情势的运用.
建门生表student,表构造以下:
列名 数据范例 许可空 sid int 许可 name nvarchar(50) 许可 插进去表数据以下:
id name 1 张三 2 李四 3 王五
建课程表sclass,表构造以下:
列名 数据范例 许可空 cid int 许可 name nvarchar(50) 许可 插进去表数据以下:
id name 1 语文 2 数学 3 英语
建student_class表,表构造以下:
列名 数据范例 许可空 sid int cid int 插进去数据以下:
cid sid 1 1 1 2 1 3 2 1 3 2 3 3
至此,数据效果是:
姓名 课程 张三 语文 张三 数学 张三 英语 李四 语文 王五 数学 王五 英语
我们须要末了的效果情势以下:
姓名 课程 张三 语文,数学,英语 李四 语文 王五 数学,英语
该怎样完成呢?
/* 效果: 张三 语文,数学,英语 李四 语文 王五 数学,英语 */select [name], stuff( ( select ','+[name] from sclass where cid in ( select cid from student_class where student.sid=student_class.sid ) for xml raw(''),elements ), 1,1,'') sclassfrom student
以上就是FOR XML之RAW情势的代码实例详解的细致内容,更多请关注ki4网别的相干文章!