FOR XML PATH ,其实它就是将查询结果集以XML形式展示,将多行的结果,展现在同一行。sql
下面咱们来写一个例子:express
假设咱们有个工做流程表:app
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','从新提交审核')
1、简单介绍ide
接下来,咱们用这个方法查询这个表的数据。函数
select * from [dbo].[Workflow_Action] for xml path
它能够将查询结果转换为一段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 '[ '+ActionName+' ]' FROM [dbo].[Workflow_Action] FOR XML PATH('')
2、实际应用 优化
--咱们看看一个操做对应的而多格流程 --一共是两层,里面一层查出单独的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
接下来,咱们再讲一个其余的函数,实现一样的效果,STUFF函数。spa
sql stuff函数用于删除指定长度的字符,并能够在制定的起点处插入另外一组字符。sql stuff函数中若是开始位置或长度值是负数,或者若是开始位置大于第一个字符串的长度,将返回空字符串。若是要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。3d
1、做用code
删除指定长度的字符,并在指定的起点处插入另外一组字符。xml
2、语法
STUFF ( character_expression , start , length ,character_expression )
参数
character_expression 一个字符数据表达式。character_expression 能够是常量、变量,也能够是字符列或二进制数据列。
start 一个整数值,指定删除和插入的开始位置。若是 start 或 length 为负,则返回空字符串。若是 start 比第一个 character_expression 长,则返回空字符串。start 能够是 bigint 类型。
length 一个整数,指定要删除的字符数。若是 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。length 能够是 bigint 类型。
返回类型
若是 character_expression 是受支持的字符数据类型,则返回字符数据。若是 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。
3、备注
一、若是开始位置或长度值是负数,或者若是开始位置大于第一个字符串的长度,将返回空字符串。若是要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。
二、若是结果值大于返回类型支持的最大值,则产生错误。
4、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'
--实例2、SQL 将列转成字符串并用逗号分隔 --一样的,咱们也用到了for xml path这个方法 SELECT STUFF((SELECT ',' + ActionName FROM [dbo].[Workflow_Action] FOR XML PATH('')),1,1,'') AS WA
--实例3、最后咱们实现,上面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
对比以上两种作法,能够自行比较哪一种方式更加简便。