sql server的for xml path与变通的行转列
SQL Server中有提供一个FOR XML PATH的子句(不知道能不能叫函数),用来将查询结果行输出成XML格式,我们可以通过这个语法做一些变通实现一些特定的功能,比如说行转列。要会变通的话,当然首先是要知道FOR XML PATH的语法。
FOR XML PATH的简单语法
假设有一个hobby表(爱好),表中有两个字段,一个是hobbyID(爱好id),一个是hName(爱好名称)。

这样,我们执行一条最简单的带FOR XML PATH子句的SQL语句,看看查询出来的结果。
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>
由结果可见FOR XML PATH子句可以将查询结果行输出成XML格式。
FOR XML PATH的变通
更多的,FOR XML PATH子句是支持传递参数的,即FOR XML PATH(schema),这样的话在查询的时候就会将行标签<row>替换为<schema>,要注意的是schema必须是字符串。
SELECT * FROM hobby FOR XML PATH('yanggb');
<yanggb>
<hobbyID>1</hobbyID>
<hName>爬山</hName>
</yanggb>
<yanggb>
<hobbyID>2</hobbyID>
<hName>游泳</hName>
</yanggb>
<yanggb>
<hobbyID>3</hobbyID>
<hName>美食</hName>
</yanggb>
这时候,就可以利用XML的特点,即空标签不会存在的特定,将行标签<row>去掉。
SELECT * FROM hobby FOR XML PATH('');
<hobbyID>1</hobbyID>
<hName>爬山</hName>
<hobbyID>2</hobbyID>
<hName>游泳</hName>
<hobbyID>3</hobbyID>
<hName>美食</hName>
那能更改/去除行标签<row>,能不能更改/去除列标签呢?答案是可以的,可以通过给列起别名的方式来更改/除列标签。要注意的是这里的别名也必须是字符串。
SELECT hobbID AS AA, hName AS BB FROM hobby FOR XML PATH('');
<AA>1</AA>
<BB>爬山</BB>
<AA>2</AA>
<BB>游泳</BB>
<AA>3</AA>
<BB>美食</BB>
与去除行标签<row>的方式不一样的是,去除列标签不能将别名定义为空字符串,否则数据库引擎会报错误:[Err] 42000 - [SQL Server]缺少对象或列名,或者对象或列名为空。对于 SELECT INTO 语句,请确保每列均具有名称。对于其他语句,请查找空的别名。不允许使用定义为 "" 或 [] 的别名。请将别名更改为有效名称。
那么要怎么去除列标签呢,做法是给字段加上空字符串(加任何字符串都可以,我的理解是这种做法修改了列值,在没有起别名的情况下,原来的列标签不再匹配列值,数据库引擎会将自动该列标签去除)。
SELECT hobbID + '', hName + '' FROM hobby FOR XML PATH('');
1爬山2游泳3美食
FOR XML PATH实现行转列
根据上面的FOR XML PATH的变通的内容,我们就可以来实现行转列了。
SELECT
hName,
(SELECT ',' + hName FROM hobby FOR XML PATH('')) AS hNames
FROM hobby FOR XML PATH('');
这样我们就能得到一个所有爱好拼接起来的列hNames。
这时候我们会发现hNames字段值多了一个逗号,使用STUFF函数(推荐)或REPLACE函数去除即可。
更多的,可以在FOR XML PATH子句前添加WHERE子句限定条件范围来限定行转列的范围(也可以使用自连接限定当前行转列的范围)。
当然了,SQL SERVER还提供了另外的行转列的PRIVOT函数和列转行的UNPRIVOT函数。
"一个姑娘不会因为你专一痴情就喜欢你,只会因为你优秀而喜欢你。"
sql server的for xml path与变通的行转列的更多相关文章
- Sql Server 之 for xml (path,raw,auto,root)
1.for xml path('str') select ID,CreateTime from dbo.ArticleInfo for xml Path('mytitle') 结果:(注意:如果是s ...
- sql server 使用for xml path 将1列多行转换为字符串连接起来,俗称 sql 合并字符
由于项目的原因,需要将一些记录分类汇总,但还要列出相关的明细,这样的需求我还是第一次遇到,蛋疼了,还是请求一下度娘吧.搜索一番还是有结果,请看以下例子: create table tb ([id] i ...
- sql server 使用for xml path 将1列多行转换为字符串连接起来
create table tb ([id] )) insert into tb ,'aa' union all ,'bb' union all ,'cc' union all ,'dd' union ...
- [转帖]SQL Server 索引中include的魅力(具有包含性列的索引)
SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 上个 ...
- sql server 查询分析器消息栏里去掉“(5 行受影响)”
sql server 查询分析器消息栏里去掉"(5 行受影响)" 在你代码的开始部分加上这个命令: set nocount on 记住在代码结尾的地方再加上: set ...
- sql server中对xml进行操作
一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XM ...
- SQL Server 2005的XML数据修改语言(XML DML)
转:http://www.microsoft.com/china/msdn/library/data/sqlserver/XMLDML.mspx?mfr=true 作为对XQuery语言的扩展,XML ...
- SQL Server 2008 对XML 数据类型操作
原文 http://www.cnblogs.com/qinjian123/p/3240702.html 一.前言 从 SQL Server 2005 开始,就增加了 xml 字段类型,也就是说可以直接 ...
- sql中的for xml path() 实现字符串拼接
通常我们需要在sql中拼接字符串 ,可以用for xml path() 来进行拼接,如下实例. 同时未去掉最后一个逗号可以用LEFT函数来实现. ) AS UserName FRO ...
随机推荐
- 让windows 10 家庭版 支持 Hyper-v 的方法
pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f ...
- MQ 分布式事务 -- 微服务应用
1.背景 友情链接:https://www.cnblogs.com/Agui520/p/11187972.html https://blog.csdn.net/fd2025/article/detai ...
- 深入理解Java对象
深入理解Java对象(理清关系) 1.对象的创建过程: 所有创建过程如下所示: new 类名 根据new的参数在常量池中定位一个类的符号引用. 如果没有找到这个符号引用,说明类还没有被加载,则进行类的 ...
- Qt固定窗口大小
指定大小 this->setMaximumSize(250, 250); 默认大小 this->setMaximumSize(this->width(), this->heig ...
- python基础-面向对象编程之反射
面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...
- python从入门到放弃之进程进阶篇
什么我们得了解清楚什么是进程,进程就是系统分配的一个资源单位,真正在程序中干活得是线程,默认是每个进程中都拥有一个线程 然后我们在了解下什么是进程池这个概念 进程池是的数量是取决于我当前电脑的逻辑处理 ...
- tp5中使用原生sql查询总结【转】
注意事项: 1.先在database.php中配置好数据库 2.只要是数据库操作必须引用 use/think/Db;严格区分大小写. 下面是方法: public function hello5() { ...
- Genymotion模拟器上money测试
1.查看APK包名:sdk\build-tools\android-4.4W>aapt dump xmltree 123.apk AndroidManifest.xml 查看包名为:com.aa ...
- day32_8_14 并发编程三 线程的GIL
一.GIL 什么是GIL? GIL是一个全局排他锁,简单来说就是为了防止多线程并行操作的锁.这里有官方解释: In CPython, the global interpreter lock, or G ...
- Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换
经过前面两篇文章的铺垫,我们这篇介绍,webdriver如何处理,一个浏览器上多个窗口之间切换的问题.我们先脑补这样一个测试场景,你在页面A点击一个连接,会在新的tab窗口打开页面B,这个时候,你在页 ...