请教一个如何在函数中循环读出一个SELECT语句的几个字段
是这样子的,我有一个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语句中,谢谢大家 sql 函数 循环 替换
[解决办法]
行列转换+字符串连接,以下写法适用于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 行受影响)
*/
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