一、环境 SQL server 2000
二、需求:一张表 servicecategorydetail.bufin 存储的是 humres 表中的id,存储形式为字符串并逗号‘,’分割,想通过in的方式查询 servicecategorydetail.bufin 中信息。
1.执行SQL
select bufin from servicecategorydetail
2.执行SQL
select t1.bufin,
buFin2 = STUFF( (select ',' + objno from humres where id in (t1.bufin) FOR XML PATH('') ), 1, 1, '')
from servicecategorydetail t1
发现,多个值逗号拼接 8a7f4fd7651370ce0165137d19bd3bc7,8a7f4fd7651370ce0165137ea4374289 in方式不生效,即使 处理加上了 单引号, '8a7f4fd7651370ce0165137d19bd3bc7','8a7f4fd7651370ce0165137ea4374289', 也不生效。那是因为,获取的结果 bufin 是字符串,而 in 中需要使用数组。
三、解决,字符串转数组,自定义函数 :字符串 循环截取法 function
CREATE FUNCTION F_SplitSTR(
@string varchar(8000), --待分拆的字符串
@symbol varchar(10) --数据分隔符
) RETURNS @table TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen = LEN(@symbol) - 1
WHILE CHARINDEX(@symbol, @string) > 0
BEGIN
INSERT @table VALUES (LEFT(@string, CHARINDEX(@symbol, @string) - 1))
SET @string = STUFF(@string, 1, CHARINDEX(@symbol, @string) + @splitlen, '')
END
INSERT @table VALUES (@string)
RETURN
END
1.执行SQL :
select
t1.bufin,
buFin2 = STUFF( (select ',' + objno from humres where id in (select * from F_SplitSTR(t1.bufin,',')) FOR XML PATH('') ), 1, 1, '')
from servicecategorydetail t1
2.结果如下:
四、扩展
1.在处理时,发现执行SQL
SELECT F_SplitSTR(bufin,',') from servicecategorydetail
2.出现错误:[FreeTDS][SQL Server]'F_SplitSTR' is not a recognized built-in function name.
3.换做查询方式即可;
select * FROM F_SplitSTR((select top 1 bufin from servicecategorydetail), ',')
4.结果如下
五:尊重别人的知识产权,参考如下:
你想点我吗?