在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 @   kevinLee  阅读(6809)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示