在sql server中,实现列数据转换成逗号隔开字符串

    项目需要,要在查询中,加上后续处理人查询条件,因为后续处理人字段存的是用户ID串,所以想用函数实现功能:根据用户ID串,返回用户姓名串

根据功能,在数据库查询窗口运行测试,sql如下:没有问题,返回用户姓名串

Code

 

结果如下:

(2 行受影响)

kevin,zhangsan

 

现在将上面的sql写成函数,@ UserIdStr是用户ID串,将上面的代码改造成函数,但编译出误。

错误为

消息2772,级别16,状态1,过程GetUserName,第19

无法从函数内访问临时表。

消息2772,级别16,状态1,过程GetUserName,第20

无法从函数内访问临时表。

消息2772,级别16,状态1,过程GetUserName,第23

无法从函数内访问临时表。

消息2772,级别16,状态1,过程GetUserName,第24

无法从函数内访问临时表。

 

表明,在函数中,不支持临时表的,将临是表改成表变量,代码如下:

 

 

Code

 

编译后提示错误如下:

消息443,级别16,状态14,过程GetUserName,第20

在函数内的'INSERT EXEC' 中对带副作用的或依赖于时间的运算符的使用无效。

经过上面两次修改,在函数中是可以支持表变量的,不支持exec命令,那怎么能实现上述功能呢,上面的思路主要是想根据用户ID串找到用户姓名列表,然后,再根据coalesce对表列进行处理,将一列一数据转换成字体符串,coalesce的具体用法,请到google下吧。说明有很多,这里不在介绍。

现在整理一下思路:

1.将用户ID串,转换成数据表

2.用户表与步骤1里的表进行多表查询,得到用户姓名表

3.通过coalesce转成字符串

有了思路,就开始动手了,在sql server 中,函数可以返回表变量,正好用上。给这一步的函数起个名称,就叫SplitToTable,代码如下:

 

Code

 

实现了第一步,紧接着,去实现第二步了,这就好实现了,可以两表join一下,或者直接多表查询。因为是要和视图接合,所以还是写成了函数,

代码如下:

 

Code

 

下面测试下函数,是否返回想要的结果数据,

PRINT dbo.GetUserName('su20090812001,su20090912002')

结果如下:

kevin,zhangsan

完全正确,符合功能的要求。至此,本篇的内容结束,本人对sql 不是很精通,所以想的是实现功能,可能sql 2005/2008 有更好的函数或新功能可以实现,请大家积极留言,共同交流一下。
附上测试表的创建sql语句和数据

Code

posted @ 2009-09-15 10:59  kevinLee  阅读(6795)  评论(0编辑  收藏  举报