一、环境 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.结果如下

五:尊重别人的知识产权,参考如下:
本文介绍了一种在SQL Server环境中将存储于servicecategorydetail表中的逗号分隔字符串转换为数组的方法,并解决了使用IN操作符进行查询的问题。通过自定义函数F_SplitSTR实现了字符串的有效分割,确保了后续查询的正确执行。

2509

被折叠的 条评论
为什么被折叠?



