我在delphi中调用储存过程B,传入参数aa,bb,cc储存过程中的有参数@Para是接收传入的字符(ac,bb,cc)
Select * from Table Where in (@Para)但是却读不到数据如果传入一个字符aa,就没有问题。
我知道可能是字符的格式问题,但是试了半天,都还是不行,请求帮忙。

解决方案 »

  1.   

    你是什么IN  (@Para)??假设为Col则写为Select * from Table Where charindex(','+col+',',','+@Para+',')
      

  2.   

    这样的情况只能用构建动态字符串来解决.
    where col in (@Para):
    @Para作为字符串参数传递进来根本就是一个字符串,而并不是楼主所期望的三个字符串:
    'ac','bb','cc'
    where col in (@Para)就相当于where col in ('ac,bb,cc')
    而不是where col in ('ac','bb','cc').
    所以,请楼主参考
    http://community.csdn.net/Expert/topic/4881/4881050.xml?temp=.511471
    那里已经给出解决方案了,只能动态.
      

  3.   

    因为如果是字符串的话要在各个字符的两边加上引号,数值型的就好办
    楼主的要求用下面的方面可以实现CREATE function udf_splitstring(@str varchar(8000),@spli varchar(10))
    returns @stringtab table(strs varchar(8000))
    as
    begin
    declare @i     int
    declare @splen int
    select @splen=len(@spli),@i=charindex(@spli,@str)
    while @i > 0
    begin
    insert into @stringtab 
    values(left(@str,@i-1))
    select @str=substring(@str,@i+@splen,8000)
    select @i=charindex(@spli,@str)
    end
    if @str<>'' insert into @stringtab values(@str)
    return
    end
    Select * from Table Where 字段 in (select strs from dbo.udf_splitstring('aa,bb,cc',','))
      

  4.   

    同意楼上,In 后的参数列表需要动态创建,hellowork(一两清风)兄弟在上例中说得很清楚了,注意在存储过程中将In 中的列表调整好!
      

  5.   

    --汗一个,写错了点Select * from Table Where charindex(','+col+',',','+@Para+',')>0--另致hellowork,不必用动态,勿轻下断言
      

  6.   

    --怎么人人都要动态,测试如下declare @test table
    (
    id int,
    col varchar(2)
    )
    insert into @test
    select 1,'aa' union all
    select 2,'bb' union all
    select 3,'cc' union all
    select 4,'dd' union all
    select 5,'ee'declare @para varchar(100)
    select @para='aa,bb,cc'select * from @test where charindex(','+col+',',','+@Para+',')>0
    /*
    id          col  
    ----------- ---- 
    1           aa
    2           bb
    3           cc完全没有必要把问题复杂化嘛
    */
      

  7.   

    如果不用in而改用charindex,应该这样:
    Select * from tab Where charindex(','''+col+''',',','++@Para+',') > 0
      

  8.   

    to:LouisXIV(夜游神) ^^
    是这样的:我的假设是楼主在存储过程中传递的参数仍然是按照in的处理方式时的情况,即:
    col in(@Para)      (相当于col in('aa','bb','cc'))
    楼主在调用存储过程时就要:
    exec sptest '''aa'',''bb'',''cc'''
    所以在使用charindex()变通时就要在col前后再加单引号才能完全匹配.
    也就是说我们解决问题的出发点是不一样的,我仍然假设楼主继续按'''aa'',''bb'',''cc'''传递参数.
    如果楼主按你所提供的方法就简单多了,传递'aa,bb,cc'就行了.
    ^^
      

  9.   

    用charindex就可以了WHERE CAHRINDEX(','+字段+',' , ','+传入的参数+',')>0
      

  10.   


    当字段值为
    a,b,c
    a,d,e
    a,c,d传入值为 a,b,c,d这时可以使用分解作用的函数
      

  11.   

    误会了.我二楼说的是指如果楼主执意要使用col in(@para)的情况下只能使用动态了,可不是针对整个问题说只有用动态来解决.即怎么样用动态来完成in的功能.^^
      

  12.   

    方法上面的说得多了, 解释一下原因in的语法是
    in(以逗号分隔的表达式列表)而楼主的
    in(@Para)
    @Para 只是表达式列表中的一个表达式, 而不是一个表达式列表.