一个存储过程的片段select .... from ..where ... and F_SubjectCode in (@mKind)
如何给这个@mKind赋值??比如我想要传入值后为 F_SubjectCode in ('101001,'101002','101003') 
我是这样写的
...
...
mSubject:='';
for i:=0 to mTString.Count-1 do
  begin
    mSubject:=mSubject+''''+mTString.Strings[i]+'''';
    if i< mTString.Count-1 then mSubject:=mSubject+',';
  end;  with AdoStoredProc1. do
    begin
      Close;
      Parameters[1].Value:=...
      Parameters[2].Value:=...;
      Parameters[3].Value:=mSubject;    //这儿对应的是存储过程的@Kind参数
      Parameters[4].Value:=...;
      Parameters[5].Value:=...;
      Parameters[6].Value:=.....;
      Open;
    end;
能运行,却查询不到结果
急盼解决!!!!

解决方案 »

  1.   


    exec('select .... from ..where ... and F_SubjectCode in (@mKind)')
      

  2.   

    我把实际值代入,在SQL查询分析器里执行能得到结果
    更奇怪的是,如果我用AdoQuery能得到正确的结果
     
    with AdoQuery1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('...);
        SQL.Add(mSubject);
        SQL.Add('...');
        Parameters[].Value:=..;
       ..
    ....
        Open;
      end;
    这样是可以的
      

  3.   

    林石:好像不能这样写的
    -----------------------------------------------------------
    IN
    确定给定的值是否与子查询或列表中的值相匹配。语法
    test_expression [ NOT ] IN
        ( 
            subquery
            | expression [ ,...n ] 
        ) -------------------------------------------------------
    一个参数在直接执行的SQL语句中只能代表一个表达式,这个表达式 可以是各种类型,你想用一个字符串代表N个表达式.除非是用 动态SQL了.像
    exec ('select .. from tbname where name in (' + @mKind + ')')
    这样来组合吧.
      

  4.   

    你提到的 with AdoQuery1 do
    也是一样的道理 他最终也是生成了一个 SQL 语句提交的.
      

  5.   

    嗯...我现在没有用那个存储过程了...用AdoQuery来代替使用....此贴散分好了...谢谢楼上
      

  6.   

    楼主还不如这样写.比如有AAAA,BBBB,CCCC 3个值要负给它.可以先把这个3个值连接成一个字符串.然后再把这个字符串负给它就是了..
      

  7.   

    关于此主题请参考:
        关于IN子句用参数代替时,多参数该如何处理?《查询》
        http://access911.net/index.asp?u1=a&u2=72FAB51E16DCE9F3
      

  8.   

    楼上....我直接用AdoQuery来解决的方法和你站内的介绍是一样的,我在本贴的2楼已说了,只是不能做为存储过程的一个参数....可能林石说的是对的....3Q!
      

  9.   

    我是CSDN的小混混,我来接分了,哈~~~