SQLSERVER 中的sql语句问题

sqlserver-当一个字段以逗号隔开存多个id,用sql取这个id对应的名字,
formtable_main_143 存储数据格式如下 id为主键(字段类型int),zrr1为HrmResource中的id组成(字段类型text)

img

HrmResource表数据如下 id字段类型int lastname字段类型varchar(1000)

img

在网上找到的方法:SELECT a.id,a.zrr1 ,'显示列' = STUFF(( SELECT ',' + b.lastname
FROM HrmResource b
where PATINDEX('%,' + RTRIM(b.id) + ',%',',' + CAST(a.zrr1 as varchar) + ',')>0
ORDER BY PATINDEX('%,' + RTRIM(b.id) + ',%',',' + CAST(a.zrr1 as varchar) + ',')
FOR XML PATH('')), 1, 1,''
)
FROM formtable_main_143 a

遇到的问题:

img


数据显示不全

http://t.csdn.cn/4H0Z3
自定义函数 字符串分割为list 然后 使用 in配合stuff 函数


-- 字符串指定字符分割为list
CREATE FUNCTION [dbo].[splitl] (
    @String VARCHAR(MAX),
    @Delimiter VARCHAR(MAX)
) RETURNS @temptable TABLE (items VARCHAR(MAX)) AS
BEGIN
    DECLARE @idx INT=1
    DECLARE @slice VARCHAR(MAX) 
    IF LEN(@String) < 1 OR LEN(ISNULL(@String,'')) = 0
        RETURN
    WHILE @idx != 0
    BEGIN
        SET @idx = CHARINDEX(@Delimiter,@String)
        IF @idx != 0
            SET @slice = LEFT(@String,@idx - 1)
        ELSE
            SET @slice = @String
        IF LEN(@slice) > 0
            INSERT INTO @temptable(items) VALUES(@slice)
        SET @String = RIGHT (@String, LEN(@String) - @idx)
        IF LEN(@String) = 0
            BREAK
    END
    RETURN
END
GO
-- 调用方式 
SELECT * FROM dbo.splitl('aaa|bbb|ccc','|')