declare @param varchar(20)='A:12,B:00,C:00,D:3'
declare @xmlparam xml = convert(xml,'<cond>'+REPLACE(@param,',','</cond><cond>')+'</cond>');with t as(
select data from(
values('A:12,B:1,C:11,D:3'),('A:11,B:00,C:11,D:3'),('A:00,B:00,C:00,D:3'),
('A:00,B:1,C:11,D:77'),('A:00,B:11,C:22,D:77')) t(data))
select distinct t.data 
from t cross apply @xmlparam.nodes('cond') t1(condition)
where t.data like '%'+condition.value('.','varchar(20)')+'%'

解决方案 »

  1.   

    上面的有Bug,用下面这个:declare @param varchar(20)='A:12,B:00,C:00,D:7'
    declare @xmlparam xml = convert(xml,'<c>,'+REPLACE(@param,',',',</c><c>,')+',</c>');with t as(
    select data from(
    values('A:12,B:1,C:11,D:3'),('A:11,B:00,C:11,D:3'),('A:00,B:00,C:00,D:3'),
    ('A:00,B:1,C:11,D:77'),('A:00,B:11,C:22,D:77')) t(data))
    select distinct t.data 
    from t cross apply @xmlparam.nodes('c') t1(condition)
    where ','+t.data+',' like '%'+condition.value('.','varchar(20)')+'%'
      

  2.   

    第一次看到这样的写法,居然没看懂。在一句句分析中解释一下:
    首先把 A:12,B:00,C:00,D:7 转换成xml:<c>,A:12,</c><c>,B:00,</c><c>,C:00,</c><c>,D:7,</c>
    然后 @xmlparam.nodes('c')是一个表值函数,会把xml按照节点c分解成多行
        可以用这个语句查看select c.value('.','varchar(20)') from @xmlparam.nodes('c') t1(c)
    再然后就是你懂得了
      

  3.   

    思路已经懂了,sdhp 看看这个问题如何弄。http://bbs.csdn.net/topics/390764415