您好,登錄后才能下訂單哦!
這篇文章主要介紹FOR XML中RAW模式的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
描述:
raw模式將查詢結(jié)果集中的每一行轉(zhuǎn)換為帶有<row>元素名稱的xml元素,將每一行的列轉(zhuǎn)換為row的屬性.
可以通過編寫嵌套FOR XML查詢來生成XML層次結(jié)構(gòu)
在默認(rèn)情況下,所有非null值都將被映射為<row>元素的屬性.
如果需要將查詢結(jié)果集中數(shù)據(jù)轉(zhuǎn)換為<row>元素的子元素,需要使用elements指令.
語法:
FOR XML RAW [ ('ElementName') ] [ <CommonDirectives> [ , { XMLDATA | XMLSCHEMA [ ('TargetNameSpaceURI') ]} ] [ , ELEMENTS [ XSINIL | ABSENT ] ] <CommonDirectives> ::= [ , BINARY BASE64 ] [ , TYPE ] [ , ROOT [ ('RootName') ] ]
具體參見例子:
建表Base,表結(jié)構(gòu)如下:
列名 數(shù)據(jù)類型 允許空 id int 允許 body nvarchar(50) 允許 插入表數(shù)據(jù)如下:
id body 1 aaaa 2 bbbb 3 cccc 4
例句:
A.返回查詢數(shù)據(jù)的信息,使用for xml raw 模式
/* 結(jié)果: <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指令使結(jié)果集以子元素的形式出現(xiàn).
/* 結(jié)果: <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;
我們注意到這個(gè)例句中沒有將id為4的body顯示出現(xiàn).
原因是因?yàn)?在使用elements指令時(shí),如果沒有指定后面的命令,則默認(rèn)使用abscent,此時(shí)不會為null值創(chuàng)建任何元素.
在下面的例句中通過使用elements xsinil可使null值顯示在xml中.
B.同時(shí)指定elements指令和xsinil指令以生產(chǎn)null列值的元素
/* 結(jié)果: <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;
對于每條數(shù)據(jù)都是以<row>元素顯示會讓人看起來很不舒服,如何修改<row>元素名稱為其他名稱呢.
C.重命名<row>元素
/* 結(jié)果: <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;
我們都知道,每個(gè)xml文件都有一個(gè)根元素,我們?nèi)绾螢檫@段xml文本加上它的根元素呢.
D.為for xml生成的xml指定根元素
可使用root指定,root指令的默認(rèn)根元素為<root>
/* 結(jié)果: <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結(jié)果似乎很不錯,但是,如果我們想要將數(shù)據(jù)庫中的body列改成xml的<data>元素,該如何修改呢?
E.修改元素名
/* 結(jié)果: <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;
現(xiàn)在的結(jié)果,基本上符合一個(gè)xml的基本格式,那么,我們設(shè)想,如果不給id,body指定列名,也不指定根元素名,也不指定元素名,那會出現(xiàn)什么記過呢?
/* 結(jié)果: 1aaaa2bbbb3dddd4 */ --因?yàn)閕d為int類型,為使id不出現(xiàn)列名,我們使id+0 --因?yàn)閎ody為nvarchar類型,為使body不出現(xiàn)列名,我們使body+''select id+0,body+'' from base for xml raw(''), elements;但是,對上面的結(jié)果,我們似乎無法分清楚每條數(shù)據(jù),而且id為4的空值也沒有顯示出來,如何進(jìn)行修改呢?見下句.
/* 結(jié)果: 1,aaaa;2,bbbb;3,dddd;4,null; */select id+0,',',isnull(body,'null')+'',';' from base for xml raw(''),elements;如此以來,似乎看到了沒有列名給我們帶的好處.其實(shí)上句還可以再修改些.
/* 結(jié)果: 1,aaaa;2,bbbb;3,dddd;4,null; */select convert(nvarchar,id)+','+isnull(body,'null')+';' from base for xml raw(''),elements;
我們再來修改,讓讓結(jié)果以另一種方式出現(xiàn).
/* 結(jié)果: {1,aaaa}{2,bbbb}{3,dddd}{4,null} */select '{'+convert(nvarchar,id)+','+isnull(body,'null')+'}' from base for xml raw(''),elements;
現(xiàn)在可以看到,我們可以根據(jù)自己的需要進(jìn)行組合,生成我們需要的結(jié)果.
在SQLServer2005中,已經(jīng)支持了xml數(shù)據(jù)類型,因此,可以通過編寫TYPE指令,將FOR XML查詢的結(jié)果以xml數(shù)據(jù)類型進(jìn)行返回,舉例如下:
declare @string nvarchar(1000)declare @xml xml/* 消息257,級別16,狀態(tài)3,第8行 不允許從數(shù)據(jù)類型xml到nvarchar的隱式轉(zhuǎn)換。請使用CONVERT函數(shù)來運(yùn)行此查詢。 */ --set @string=(select id,body from base for xml raw,type)set @xml=(select id,body from base for xml raw,type)
最后,以一個(gè)常用的例子來介紹for xml raw模式的應(yīng)用.
建學(xué)生表student,表結(jié)構(gòu)如下:
列名 數(shù)據(jù)類型 允許空 sid int 允許 name nvarchar(50) 允許 插入表數(shù)據(jù)如下:
id name 1 張三 2 李四 3 王五
建課程表sclass,表結(jié)構(gòu)如下:
列名 數(shù)據(jù)類型 允許空 cid int 允許 name nvarchar(50) 允許 插入表數(shù)據(jù)如下:
id name 1 語文 2 數(shù)學(xué) 3 英語
建student_class表,表結(jié)構(gòu)如下:
列名 數(shù)據(jù)類型 允許空 sid int cid int 插入數(shù)據(jù)如下:
cid sid 1 1 1 2 1 3 2 1 3 2 3 3
至此,數(shù)據(jù)結(jié)果是:
姓名 課程 張三 語文 張三 數(shù)學(xué) 張三 英語 李四 語文 王五 數(shù)學(xué) 王五 英語
我們需要最后的結(jié)果形式如下:
姓名 課程 張三 語文,數(shù)學(xué),英語 李四 語文 王五 數(shù)學(xué),英語
該如何實(shí)現(xiàn)呢?
/* 結(jié)果: 張三 語文,數(shù)學(xué),英語 李四 語文 王五 數(shù)學(xué),英語 */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模式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。