FOHighlander XML PATH
,其实它正是将查询结果集以XML情势表现,将多行的结果,呈今后同一行。
转载:https://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html
上面大家来写二个例证:
FO奥迪Q5 XML PATH
有的人也许知道某一个人恐怕不精通,其实它正是将查询结果集以XML格局展现,有了它我们能够简化大家的查询语句完结部分原先大概供给借助函数活存款和储蓄进程来造成的行事。那么以贰个实例为主.
假如大家有个职业流程表:
一.FOLacrosse XML PATH 简介
那么仍旧首先来介绍一下FO翼虎 XML PATH
,借使未来有一张兴趣爱好表(hobby)用来寄放兴趣爱好,表结构如下:
CREATE TABLE [dbo].[Workflow_Action](
[WorkflowSchema] [nvarchar](128) NULL,
[ActionSchema] [nvarchar](128) NULL,
[ActionName] [nvarchar](64) NULL
)
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('material-price','confirm','审核通过')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('material-price','reject','审核驳回')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('material-price','executing','执行价格')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('material-price','non-executing','不执行价格')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('oa-meeting-apply','confirm','审核通过')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('oa-meeting-apply','reject','审核驳回')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('oa-officialSeal-apply','confirm','审核通过')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('oa-officialSeal-apply','reject','审核驳回')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('oa-officialSeal-apply','returned','归还公章')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase','commit','提交审核')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase','reject','采购驳回')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase','confirm','审核通过')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase','order','采购下单')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase','recommit','重新提交审核')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase','part-consignment','部分收货')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase','consignment','完成收货')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase-request','commit','提交审核')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase-request','confirm','审核通过')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase-request','reject','申请驳回')
INSERT INTO [dbo].[Workflow_Action] ([WorkflowSchema],[ActionSchema],[ActionName]) VALUES ('purchase-request','recommit','重新提交审核')
接下来大家来看使用FOQashqai XML PATH的查询结果语句如下:
数据表和数码
SELECT * FROM @hobby FOR XML PATH
结果:
一、简要介绍
<row>
<hobbyID>1</hobbyID>
<hName>爬山</hName>
</row>
<row>
<hobbyID>2</hobbyID>
<hName>游泳</hName>
</row>
<row>
<hobbyID>3</hobbyID>
<hName>美食</hName>
</row>
接下去,大家用那一个措施查询那个表的数码。
select * from [dbo].[Workflow_Action] for xml path
它可以将查询结果转换为一段XML格式的代码
同理可得FORAV4 XML PATH 可以将查询结果依附行输出成XML每一项!
那么,怎么着退换XML行节点的称号呢?代码如下:
--for xml path 后面可以写东西,for xml path(Schema),这样写的话,可以将节点<row>变成<Schema>
select WorkflowSchema as WS,ActionSchema as SC,ActionName as AN from [dbo].[Workflow_Action] for xml path('Schema')
SELECT * FROM @hobby FOR XML PATH(‘MyHobby’)
--我们还可以单独输出某一个字段的值
SELECT '[ '+ActionName+' ]' FROM [dbo].[Workflow_Action] FOR XML PATH('')
结果自然也总之了呢?没有错原本的行节点<row>
变成了我们在PATH前面括号()中,自定义的称号<MyHobby>,结果如下:
<MyHobby>
<hobbyID>1</hobbyID>
<hName>爬山</hName>
</MyHobby>
<MyHobby>
<hobbyID>2</hobbyID>
<hName>游泳</hName>
</MyHobby>
<MyHobby>
<hobbyID>3</hobbyID>
<hName>美食</hName>
</MyHobby>
二、实际使用
--我们看看一个操作对应的而多格流程
--一共是两层,里面一层查出单独的ActionName,拼成一行,然后使用where条件连接外层
SELECT WorkflowSchema,
(SELECT ActionName+',' FROM [dbo].[Workflow_Action]
WHERE WorkflowSchema=A.WorkflowSchema --必须加的条件
FOR XML PATH('')) AS ActionList
FROM [dbo].[Workflow_Action] A
GROUP BY WorkflowSchema
--where 连接条件必须要,如果去掉,就会查出所有的ActionName,如同上面示例一样
--现在我们优化一下格式,会发现最后多了一个‘,’符号,用LEFT函数去掉他,继续在外面接一层查询
select B.WorkflowSchema,
LEFT(B.ActionList,LEN(B.ActionList)-1) as ActionList
from (
SELECT WorkflowSchema,
(SELECT ActionName+',' FROM [dbo].[Workflow_Action]
WHERE WorkflowSchema=A.WorkflowSchema
FOR XML PATH('')) AS ActionList
FROM [dbo].[Workflow_Action] A
GROUP BY WorkflowSchema) as B
这年留意的仇人肯定又会问那么列节点怎样转移啊?还记的给列起外号的最首要字AS吗?对了便是用它!代码如下:
SELECT hobbyID as ‘MyCode’,hName as ‘MyName’ FROM @hobby FOR XML PATH(‘MyHobby’)
接下来,咱们再讲三个另外的函数,完成平等的功效,STUFF函数。
那么今年大家列的节点名称也会编制程序我们自定义的称谓
<MyCode>与<MyName>结果如下:
sql
stuff函数用于删除钦定长度的字符,并能够在制定的源点处插入另一组字符。sql
stuff函数中一经开首地方或长度值是负数,也许一旦初始地方大于第一个字符串的长短,将回来空字符串。倘诺要去除的长度超越第多个字符串的尺寸,将去除到首个字符串中的第二个字符。
一、作用
<MyHobby>
<MyCode>1</MyCode>
<MyName>爬山</MyName>
</MyHobby>
<MyHobby>
<MyCode>2</MyCode>
<MyName>游泳</MyName>
</MyHobby>
<MyHobby>
<MyCode>3</MyCode>
<MyName>美食</MyName>
</MyHobby>
删除钦点长度的字符,并在钦点的源点处插入另一组字符。
二、语法
噢!
既然行的节点与列的节点我们都能够自定义,咱们是还是不是足以营造我们心爱的输出格局吧?仍旧看代码:
STUFF ( character_expression , start , length
,character_expression )
SELECT ‘[ ‘+hName+’ ]’ FROM @hobby FOR XML PATH(”)
参数
没有错大家还能透过标识+号,来对字符串类型字段的出口格式进行定义。结果如下:
character_expression 二个字符数据他们表达式。character_expression
能够是常量、变量,也能够是字符列或二进制数据列。
[ 爬山 ][ 游泳 ][ 美食 ]
start 贰个卡尺头值,钦命删除和插入的起来地方。固然start 或 length 为负,则赶回空字符串。假诺 start 比第贰个character_expression 长,则赶回空字符串。start 可以是 bigint 类型。
那么别的项指标列怎么自定义?
不要紧,我们将它们转换到字符串类型就行啊!例如:
length 三个整数,钦命要删减的字符数。尽管 length
比第八个 character_expression 长,则最多删除到最后二个character_expression 中的最终三个字符。length 能够是 bigint 类型。
SELECT ‘{‘+STR(hobbyID)+’}’,'[ ‘+hName+’ ]’ FROM @hobby FOR XML PATH(”)
再次来到类型
好的 FOLAND XML PATH就大旨介绍到此地吧,越来越多关于FOGranCabrioXML的文化请查阅匡助文书档案!
如果 character_expression
是受支持的字符数据类型,则赶回字符数据。如若 character_expression
是贰个受援助的 binary 数据类型,则赶回二进制数据。
接下去大家来看三个FOENCORE XML PATH的行使场景吧!那么早先吧。。。。。。
三、备注
二.三个施用场景与FO奔驰M级 XML PATH应用
1、假如开始地方或长度值是负数,恐怕只要初阶地方大于第叁个字符串的尺寸,将再次来到空字符串。纵然要删减的长短超越第一个字符串的长度,将去除到第叁个字符串中的第七个字符。
先是呢!我们在加码一张学生表,列分别为(stuID,sName,hobby),stuID代表学生编号,sName代表学生姓名,hobby列存学生的心爱!那么未来表结构如下:
2、假使结果值赶过再次来到类型辅助的最大值,则发出错误。
四、sql stuff函数
那时,大家的渴求是询问学生表,突显全数学生的爱护的结果集,代码如下:
--实例一
select STUFF('abcdefg',1,0,'1234') --结果为'1234abcdefg'
select STUFF('abcdefg',1,1,'1234') --结果为'1234bcdefg'
select STUFF('abcdefg',2,1,'1234') --结果为'a1234cdefg'
select STUFF('abcdefg',2,2,'1234') --结果为'a1234defg'
--实例二、SQL 将列转成字符串并用逗号分隔
--同样的,我们也用到了for xml path这个方法
SELECT STUFF((SELECT ',' + ActionName FROM [dbo].[Workflow_Action] FOR XML PATH('')),1,1,'') AS WA
SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
SELECT sName,
(SELECT hobby+’,’ FROM student
WHERE sName=A.sName
FOR XML PATH(”)) AS StuList
FROM student A
GROUP BY sName
) B
--实例三、最后我们实现,上面for xml path的功能
--先查出两个字段,然后对ActionName这个字段进行转化,where条件记得加上,不加就会显示出所有的ActionName
select WorkflowSchema,
ActionName=(STUFF((select ',' + ActionName
from [dbo].[Workflow_Action] a
where a.WorkflowSchema=b.WorkflowSchema for xml path('')),1,1,'')) --where条件必须加上
from [dbo].[Workflow_Action] b group by WorkflowSchema
结果如下:
分析: 好的,那么大家来分析一下,首先看那句:
相比较以上三种做法,能够活动相比较哪类艺术尤其便利。
SELECT hobby+’,’ FROM student
WHERE sName=A.sName
FOR XML PATH(”)
那句是透过FOMurano XML PATH 将某一姓名如张三的爱好,展现成格式为:“
爱好1,爱好2,爱好3,”的格式!
这就是说随着看:
SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
SELECT sName,
(SELECT hobby+’,’ FROM student
WHERE sName=A.sName
FOR XML PATH(”)) AS StuList
FROM student A
GROUP BY sName
) B
余下的代码首先是将表分组,在实行FO瑞虎 XML PATH
格式化,那时当还从未实施最外层的SELECT时查询出的结构为:
能够看来StuList列里面包车型客车多少都会多出三个逗号,那时随外层的口舌:SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 正是来去掉逗号,并予以有含义的列明!