首页
统计
留言
友链
壁纸
Search
1
Notion网页端汉化、主题修改
709 阅读
2
SnapicPlus主题添加视频功能以及使用外链详解、图片加载缓慢问题解决
551 阅读
3
Gravatar镜像源地址大全
538 阅读
4
typecho主题中文搜索404问题解决
510 阅读
5
Notion客户端中文安装
444 阅读
Web前端
ES6
Vue.js
Node.js
JavaScript
其他前端扩展
后端探索
数据库
服务器
小程序
手机端
奇技淫巧
成功之母
时光随笔
登录
Search
标签搜索
SQL
typecho
SqlServer
MySql
jQuery
JavaScript
npm
Gravatar
镜像
google
Java
包管理工具
前端
JS
node
数据库
Notion
BEGIN...END
EXECUTE
404
天祈
累计撰写
66
篇文章
累计收到
14
条评论
首页
栏目
Web前端
ES6
Vue.js
Node.js
JavaScript
其他前端扩展
后端探索
数据库
服务器
小程序
手机端
奇技淫巧
成功之母
时光随笔
页面
统计
留言
友链
壁纸
搜索到
1
篇与
的结果
2022-06-13
3. FOR XML (SQL Server) : SELECT 查询将结果作为行集返回
环境要求{alert type="info"} MicroSoft SqlServer 文档 所有版本 SQL Server版本均支持此语法 {/alert}基本初识{alert type="success"}在 FOR XML 子句中,有 RAW、AUTO、EXPLICIT、PATH 四种模式。RAW 模式: RAW 模式在 SELECT 语句返回的行集中为每个行生成一 <个行> 元素。 可以通过编写嵌套 FOR XML 查询来生成 XML 层次结构。AUTO 模式: AUTO 模式将基于指定 SELECT 语句的方式来使用试探性方法在 XML 结果中生成嵌套。 您对生成的 XML 的形状具有最低限度的控制能力。 除了 AUTO 模式的试探性方法生成的 XML 形状之外,还可以编写 FOR XML 查询来生成 XML 层次结构。EXPLICIT模式: EXPLICIT 模式允许对 XML 的形状进行更多控制。 您可以随意混合属性和元素来确定 XML 的形状。PATH模式: PATH 模式与嵌套 FOR XML 查询功能一起以较简单的方式提供了 EXPLICIT 模式的灵活性。{/alert}测试数据库:{card-default label="创建数据库表" width="100%"}CREATE TABLE [dbo].[userTable]( [id] [nvarchar](50) NULL, [encode] [nvarchar](50) NULL, [name] [nvarchar](50) NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[userTable] ADD CONSTRAINT [DF_user_id] DEFAULT (newid()) FOR [id] GO {/card-default} {card-default label="插入测试数据" width="100%"}INSERT [dbo].[userTable] ([id], [encode], [name]) VALUES (N'1A074FE5-BAB3-4B71-932D-393387E94B5F', N'001', N'张三') GO INSERT [dbo].[userTable] ([id], [encode], [name]) VALUES (N'F75F5FA1-D8A1-4076-B840-99941DB9038F', N'002', N'李四') GO INSERT [dbo].[userTable] ([id], [encode], [name]) VALUES (N'FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4', N'003', N'王五') GO INSERT [dbo].[userTable] ([id],[encode], [name]) VALUES (N'79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A', N'004',null) {/card-default}{card-default label="测试表视图" width=""}idencodename1A074FE5-BAB3-4B71-932D-393387E94B5F001张三F75F5FA1-D8A1-4076-B840-99941DB9038F002李四FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4003王五79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A004NULL{/card-default}使用示例:{callout color="#bff990"}将查询结果作为行集返回,即只有一个查询行,此行只有一个查询列。多个指令可使用 逗号 分割开。{/callout}RAW模式示例一 : 基本使用{card-default label="SQL语句" width="100%"}select * from userTable for xml raw ;{/card-default}{card-default label="执行结果" width="100%"}<!--普通使用--> <row id="1A074FE5-BAB3-4B71-932D-393387E94B5F" encode="001" name="张三" /> <row id="F75F5FA1-D8A1-4076-B840-99941DB9038F" encode="002" name="李四" /> <row id="FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4" encode="003" name="王五" /> <row id="79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A" encode="004" />{/card-default}示例二 : ELEMENTS 指令{card-default label="SQL语句" width="100%"}select * from userTable for xml raw,ELEMENTS ;{/card-default} {card-default label="执行结果" width="100%"}<!--ELEMENTS指令:检索以元素为中心的 XML--> <row> <id>1A074FE5-BAB3-4B71-932D-393387E94B5F</id> <encode>001</encode> <name>张三</name> </row> <row> <id>F75F5FA1-D8A1-4076-B840-99941DB9038F</id> <encode>002</encode> <name>李四</name> </row> <row> <id>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</id> <encode>003</encode> <name>王五</name> </row> <row> <id>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</id> <encode>004</encode> </row>{/card-default}示例三 : XSINIL 添加指令 ELEMENTS{card-default label="SQL语句" width="100%"}select * from userTable for xml raw,ELEMENTS XSINIL ;{/card-default}{card-default label="执行结果" width="100%"}<!--XSINIL 添加指令 ELEMENTS:对为 Null 值的数据生成XML--> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>1A074FE5-BAB3-4B71-932D-393387E94B5F</id> <encode>001</encode> <name>张三</name> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>F75F5FA1-D8A1-4076-B840-99941DB9038F</id> <encode>002</encode> <name>李四</name> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</id> <encode>003</encode> <name>王五</name> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</id> <encode>004</encode> <name xsi:nil="true" /> </row>{/card-default}示例四 : XMLDATA 指令{card-default label="SQL语句" width="100%"}select * from userTable for xml raw,XMLDATA ;{/card-default}{card-default label="执行结果" width="100%"}<!-- 返回描述文档结构的 XML-DATA 架构 --> <Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="row" content="empty" model="closed"> <AttributeType name="id" dt:type="string" /> <AttributeType name="encode" dt:type="string" /> <AttributeType name="name" dt:type="string" /> <attribute type="id" /> <attribute type="encode" /> <attribute type="name" /> </ElementType> </Schema> <row xmlns="x-schema:#Schema1" id="1A074FE5-BAB3-4B71-932D-393387E94B5F" encode="001" name="张三" /> <row xmlns="x-schema:#Schema1" id="F75F5FA1-D8A1-4076-B840-99941DB9038F" encode="002" name="李四" /> <row xmlns="x-schema:#Schema1" id="FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4" encode="003" name="王五" /> <row xmlns="x-schema:#Schema1" id="79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A" encode="004" />{/card-default}其他{alert type="info"}FOR XML RAW ('xx'): 重命名 <行> 元素。ROOT 指令: 为 FOR XML 生成的 XML 指定根元素。比如:ROOT('MyRoot');XMLSCHEMA 指令: 返回 XSD 架构 。比如:可以使用 XMLSCHEMA ('urn:example.com') 格式指定命名空间 。BINARY BASE64 指令: 返回在 varbinary(max)、binary 类型列中存储的 以 base64 编码格式返回二进制数据。{/alert}AUTO 模式示例一:{card-default label="SQL语句" width="100%"}select * from userTable x for xml AUTO;{/card-default}{card-default label="执行结果" width="100%"}<!-- 可以为表设置别名 同时结合上述指令 --> <userTable id="1A074FE5-BAB3-4B71-932D-393387E94B5F" encode="001" name="张三" /> <userTable id="F75F5FA1-D8A1-4076-B840-99941DB9038F" encode="002" name="李四" /> <userTable id="FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4" encode="003" name="王五" /> <userTable id="79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A" encode="004" />{/card-default}示例二:{callout color="#f0ad4e"} 先指定 OrderHeader 表中的列,再指定 Cust 表中的列, 因此,将创建第一个 元素,然后将 子元素添加到其中。{/callout}{card-default label="SQL语句" width="100%"}elect OrderHeader.CustomerID, OrderHeader.SalesOrderID, OrderHeader.Status, Cust.CustomerID, Cust.CustomerType from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader where Cust.CustomerID = OrderHeader.CustomerID for xml auto; {/card-default}{card-default label="执行结果" width="100%"}<!-- 可结合 ELEMENTS 等其他指令--> <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5"> <Cust CustomerID="1" CustomerType="S" /> </OrderHeader> ...{/card-default}PATH 模式示例一{card-default label="SQL语句" width="100%"}select * from userTable for xml PATH {/card-default}{card-default label="执行结果" width="100%"}<row> <id>1A074FE5-BAB3-4B71-932D-393387E94B5F</id> <encode>001</encode> <name>张三</name> </row> <row> <id>F75F5FA1-D8A1-4076-B840-99941DB9038F</id> <encode>002</encode> <name>李四</name> </row> <row> <id>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</id> <encode>003</encode> <name>王五</name> </row> <row> <id>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</id> <encode>004</encode> </row>{/card-default}示例二{card-default label="SQL语句" width="100%"}select * from userTable for xml PATH('') ;{/card-default}{card-default label="执行结果" width="100%"}<id>1A074FE5-BAB3-4B71-932D-393387E94B5F</id> <encode>001</encode> <name>张三</name> <id>F75F5FA1-D8A1-4076-B840-99941DB9038F</id> <encode>002</encode> <name>李四</name> <id>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</id> <encode>003</encode> <name>王五</name> <id>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</id> <encode>004</encode>{/card-default}示例三{callout color="#58d336"}如果列名称以符号 (@) 开头,并且不包含斜杠标记 (/),则会创建具有相应列值的元素的属性 row在对应的语句中,可根据不同模式对表名、列名进行别名的设置而得到相应得到XML结构{/callout}{card-default label="SQL语句" width="100%"}select id as '@part',encode as '@code',name from userTable for xml PATH{/card-default}{card-default label="执行结果" width="100%"}<row part="1A074FE5-BAB3-4B71-932D-393387E94B5F" code="001"> <name>张三</name> </row> <row part="F75F5FA1-D8A1-4076-B840-99941DB9038F" code="002"> <name>李四</name> </row> <row part="FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4" code="003"> <name>王五</name> </row> <row part="79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A" code="004" />{/card-default}示例四{callout color="#f4d19f"}如果列名不以符号 () @ 开头,但包含斜杠标记 (/) ,则列名表示 XML 层次结构。 {/callout}{card-default label="SQL语句" width="100%"}select ID as 'ID1/ID2',ENCODE,NAME from userTable for xml PATH{/card-default}{card-default label="执行结果" width="100%"}<row> <ID1> <ID2>1A074FE5-BAB3-4B71-932D-393387E94B5F</ID2> </ID1> <ENCODE>001</ENCODE> <NAME>张三</NAME> </row> <row> <ID1> <ID2>F75F5FA1-D8A1-4076-B840-99941DB9038F</ID2> </ID1> <ENCODE>002</ENCODE> <NAME>李四</NAME> </row> <row> <ID1> <ID2>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</ID2> </ID1> <ENCODE>003</ENCODE> <NAME>王五</NAME> </row> <row> <ID1> <ID2>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</ID2> </ID1> <ENCODE>004</ENCODE> </row>{/card-default}示例五{callout color="#f2eade"}如果指定的列名是通配符 (*) ,则插入该列的内容就好像没有指定列名一样。 如果此列不是xml 类型的列,则此列的内容将作为文本节点插入.{/callout}{card-default label="SQL语句" width="100%"}select ID as '*',ENCODE,NAME from userTable for xml PATH {/card-default}{card-default label="执行结果" width="100%"}<row>1A074FE5-BAB3-4B71-932D-393387E94B5F<ENCODE>001</ENCODE><NAME>张三</NAME></row> <row>F75F5FA1-D8A1-4076-B840-99941DB9038F<ENCODE>002</ENCODE><NAME>李四</NAME></row> <row>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4<ENCODE>003</ENCODE><NAME>王五</NAME></row> <row>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A<ENCODE>004</ENCODE></row>{/card-default}示例六{callout color="#c4c0ba"}如果列名是某个 XPath 节点测试,将如下表所示映射该列的内容。 如果列名是某个 XPath 节点测试,则该列的内容将映射到相应的节点。 如果该列的 SQL 类型是 xml,将返回一个错误。{/callout}列名行为text()对于名为 text() 的列,该列中的字符串值将被添加为文本节点。comment()对于名为 comment() 的列,该列中的字符串值将被添加为 XML 注释。node()对于节点名称 () 的列,结果与列名称是通配符 () * 时的结果相同。处理指令(名称)如果列名为处理指令,该列中的字符串值将被添加为此处理指令目标名称的 PI 值。{card-default label="SQL语句" width="100%"}select ID as 'text()',ENCODE as 'comment()',NAME as 'node()' from userTable for xml PATH {/card-default}{card-default label="执行结果" width="100%"}<row>1A074FE5-BAB3-4B71-932D-393387E94B5F<!--001-->张三</row> <row>F75F5FA1-D8A1-4076-B840-99941DB9038F<!--002-->李四</row> <row>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4<!--003-->王五</row> <row>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A<!--004--></row>{/card-default}示例七{card-default label="SQL语句" width="100%"}select ','+ID from userTable for xml PATH(''){/card-default}{card-default label="执行结果" width="100%"},1A074FE5-BAB3-4B71-932D-393387E94B5F,F75F5FA1-D8A1-4076-B840-99941DB9038F,FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4,79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A{/card-default}EXPLICIT 模式{callout color="#37ae9b"}具体可参阅微软官方文档{/callout}
2022年06月13日
221 阅读
0 评论
1 点赞