最近在项目中遇到个问题,需要将表中某列字段合并成字符串输出,如果直接通过代码全部读取出来,再遍历进行拼接显然不是最好的方法,所以想着能否在数据读取的时候直接拼接好返回,网上搜了可通过for xml来实现。

  首先,准备好需要的数据,脚本如下:  

if exists (select * from sysObjects where id=object_id('Student'))
drop table Student
go create table Student
(
Id int,
Name varchar(20)
) go
insert into Student values(1,'张三');
insert into Student values(2,'李四');
insert into Student values(3,'王五');

 当前表中数据如下:

  

 需要将Name以“张三;李四;王五”格式显示。

 具体通过实现如下:  

select stuff((
select ';'+name
from Student for xml path('')),1,1,'') as name

 乍一看,是不是有点迷糊,不急,下面我们一一道来。

 上面语句我们分为两部分来看,首先要明白for xml path的用法,在SQL SERVER中我们有很多方法读取XML字段中的片段,反过来SQL SERVER也允许我们将表数据以XML方式显示,for xml path便是以xml显示的一种方式。  

  select ';'+name
from Student for xml path('')

 这段代码就是告诉数据库服务器要将生成的XML中name值以“;”方式进行拼接。

更多可参考:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html

其次,我们理解stuff函数的用法,通过上述代码拼接生成的内容为“;张三;李四;王五”,显然最前的“;”是多余的,所以我们通过stuff来去除。

 STUFF(string,insert position,delete count,string inserted)函数是将一个字符串插入到另一个字符串中。插入时,插入的字符串可能删除指定数量的字符。

 第一个参数string,指的就是你要操作的内容,可以是一个固定字符串,也可以指定为某列;

 第二个参数insert position,指插入开始位置,SQLSERVER中默认是从1开始,而非从0开始;

 第三个参数delete count,指的是要删除的字符个数,从position删除指定的个数,如果count为0表示不删除;

 第四个参数string inserted,表示要插入的字符串;

eg:select  stuff('abcdefg',3,2,'123')

 结果:ab123efg

Sql Server将一列字段拼接成字符串方法的更多相关文章

  1. Sql Server判断某列字段是否为空或判断某列字段长度

    1.用is null 和 is not null来判断字段是否为空. 2.用len()函数来判断字段长度.

  2. 在sql脚本中将查询结果集拼接成字符串

  3. sql语句将查询的结果拼接成字符串

    表样: sqlserver: --方法1 DECLARE @STR VARCHAR(8000) SELECT @STR=ISNULL(@STR+',','')+userID FROM (SELECT  ...

  4. SQL查询结果拼接成字符串

    sqlserver中将查询结果拼接成字符串   #for xml path(param)--将查询结果以xml格式输出 1 select id,name from table1 for xml pat ...

  5. SQL Server表描述 及 字段描述的增、删、改、查询

    SQL Server表描述 及 字段描述的增.删.改.查询 --测试: --创建表及描述信息 ),isname )) --为表添加描述信息 EXECUTE sp_addextendedproperty ...

  6. sql server like 在将值转换成数据类型int失败

    select * from table where title like '%'?'%'; 采用? 传参会报错:sql server like 在将值转换成数据类型int失败 select * fro ...

  7. SQL Server 按某一字段分组 取 最大 (小)值所在行的数据

    SQL Server 按某一字段分组 取 最大 (小)值所在行的数据 -- 按某一字段分组 取 最大 (小)值所在行的数据 -- (爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23 ...

  8. SQL Server数据库自增字段正确的插入值的描述

    我们今天主要向大家讲述的是SQL Server数据库之向SQL Server自增字段正确的插入值的实际操作步骤,在一般的情况下,我们不能向 SQL Server 数据库自增字段中插入值,如果非要这么干 ...

  9. SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF

    原文:SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF 本来用 Writer 写一篇关于一列多行合并的博客来的,结果快写完了时候,在一个插入代码时候,崩了,重新打开,居然 ...

随机推荐

  1. 类和对象(9)—— new和delete

    对象动态建立和释放 new 和delete 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C ...

  2. php system()

    学习源头: https://blog.csdn.net/ltx06/article/details/53992905 system(“nohup ./test.py $s &”); 这个不会在 ...

  3. 关于C#客户端引用C++ dll的问题

    近期在做项目的过程中需要在Winform客户端项目引用由C++编译的DLL,于是对相关的内容进行了一些研究,有几点心得总结如下. 第一步是制作要引用的类库: (1)首先拿到C++的dll,需要注意的是 ...

  4. 经典SQL问题: 行转列,列转行

    情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有 ...

  5. 西安电子科技大学第16届程序设计竞赛 E Xieldy And His Password

    链接:https://www.nowcoder.com/acm/contest/107/E来源:牛客网 Xieldy And His Password 时间限制:C/C++ 1秒,其他语言2秒 空间限 ...

  6. SQL修改日期时间型数据中的年月日

    以下语句为更改 tevent表中的eventtime字段为2011-7-16当eventtime为2012-02-29时 update tevent set  eventtime='2011-7-16 ...

  7. 微信小程序的组件总结

    本文介绍微信小程序的组件 视图容器 基础内容 表单组件 导航组件 媒体组件 视图容器 view 布局容器 <view hover-class='bg'>222</view> 可 ...

  8. 2016.2.24 利用用户控件和委托完美解决快速选择txbbox

    1.首先将tet_box和一个datagridview控件打包成用户控件uC_QuickTxtBox 2.在用户控件中定义执行主窗口的委托函数 3.主窗体中添加用户控件的load事件,赋值 uC_Qu ...

  9. Drools学习笔记2—Conditions / LHS 匹配模式&条件元素

    Rule的LHS由条件元素(Conditional Elements—CE)和匹配模式(Patterns)组成 Patterns被用来指示出fact的字段约束 每个约束必须为true才能让RHS的ac ...

  10. 分布式爬虫搭建系列 之一------python安装及以及虚拟环境的配置及scrapy依赖库的安装

    python及scrapy框架依赖库的安装步骤: 第一步,python的安装 在Windows上安装Python 首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Pyt ...