• 在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

  • 相关阅读:
    idea 设置注释
    SVN解决冲突
    mysql执行 sql文件遇到USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=utf8错误
    如何查看JDK以及JAVA框架的源码
    一道常被人轻视的前端JS面试题
    Js 常用调试的方法
    主要的Ajax框架都有什么?
    Ajax使用的五步法
    Java正则表达式
    查出在当天所处的日期区间的某些数据
  • 原文地址:https://www.cnblogs.com/kevinlzf/p/1566828.html
Copyright © 2020-2023  润新知