请教一个如何在函数中循环读出一个SELECT语句的几个字段

CTBOK 2013-03-21 10:21:35
是这样子的,我有一个A表,表里有字段:
id name code
xx 工程师 001
xx 建筑师 002
xx 设计师 003

另还有B表
id name code
xx 张三 001,002
xx 李四 002,003
xx 王五 003,001

我要把b表的code转成中文输出,暂时我自己有两个思路:
思路一:
在函数中有输入变量@a,这个输入变量@a就是B表的CODE,如'001,003',这个输入变量,来自于调有这个函数的SELECT语句。然后在函数里,select code from a表的code字段,然后循环读取的有结果,把得到的code,replace在函数输入变量@a,把替换后的中文结果返回出去。

思路二:只写一个select语句,即可以达成以下效果,不过我不会怎样写
id name code codecn
xx 张三 001,002 工程师,建筑师
xx 李四 002,003 建筑师,设计师
xx 王五 003,001 设师师,工程师

大家如果有另外的思路也行,能完成所需的效果就可以了,不过不能用存储过程,因为我要这个函数的输出结果,直接用在另外一个select语句中,谢谢大家
...全文
312 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2013-03-22
  • 打赏
  • 举报
回复
引用 6 楼 sz_haitao 的回复:
直接字符串替换
看A表的记录是不是很少修改? 利用触发器,每次修改就自动更新替换函数
haitao 2013-03-22
  • 打赏
  • 举报
回复
直接字符串替换
  • 打赏
  • 举报
回复
select b.*,stuff((select ','+a.name from a where charindex(','+code+',',','+b.code+',')>0 for xml path('')),1,1,'')codecn from b
fcuandy 2013-03-21
  • 打赏
  • 举报
回复
写法是很多的。

drop table ta,tb
go
create table ta(code varchar(10),name varchar(10))
insert into ta values('01,02', 'A公司') 
insert into ta values('02,03,01', 'B公司') 
 
create table tb(code varchar(10),linkname varchar(10))
insert into tb values('01', 'aaa') 
insert into tb values('02', 'bbb') 
insert into tb values('03', 'ccc') 

go
 
SELECT * FROM ta m
CROSS APPLY
(SELECT
        STUFF((SELECT ',' + linkname AS [text()] 
        FROM  tb n  
        WHERE ',' + m.code + ',' like '%,' + n.code + ',%'
        FOR XML PATH('')), 1, 1, '') as linkname
) b

select code,name, lname=stuff((select ','+linkname from tb b where ',' + a.code + ',' like '%,' + b.code + ',%' for xml path('')), 1, 1, '')
from ta a
group by code,name
fcuandy 2013-03-21
  • 打赏
  • 举报
回复
引用 2 楼 siyou 的回复:
2楼的兄弟,你没看清我的题目啊,字段的内容与结构都不一样,我的CODE字段是有,分隔,含有另外一个对照表的多个字段的多对多关系
你自己理解不到二楼的意思。 照抄肯定是不行的。 自己把子查询里的连表条件改下就出来了。
CTBOK 2013-03-21
  • 打赏
  • 举报
回复
2楼的兄弟,你没看清我的题目啊,字段的内容与结构都不一样,我的CODE字段是有,分隔,含有另外一个对照表的多个字段的多对多关系
seusoftware 2013-03-21
  • 打赏
  • 举报
回复
行列转换+字符串连接,以下写法适用于2005及以上版本

create table ta(code varchar(10),name varchar(10))
insert into ta values('01', 'A公司') 
insert into ta values('02', 'B公司') 

create table tb(code varchar(10),linkname varchar(10))
insert into tb values('01', 'aaa') 
insert into tb values('01', 'bbb') 
insert into tb values('01', 'ccc') 
insert into tb values('02', 'ddd') 
insert into tb values('02', 'eee')
go

select a.code,a.name,b.linkname
from ta a inner join
  (SELECT distinct code,
		STUFF((SELECT ',' + linkname AS [text()] 
        FROM tb n  
        WHERE n.code = m.code
        FOR XML PATH('')), 1, 1, '') as linkname
  FROM tb m 
  ) b ON b.code=a.code 


/*
code      name      linkname
---------- ---------- --------------
01        A公司        aaa bbb ccc
02        B公司        ddd eee
(2 行受影响)
*/

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧