类似“SELECT * FROM TABLEA AS A WHERE (A.FILED1 IN ('V1','V2','V3','V4')) ”中的条件:A.FILED1 IN ('V1','V2','V3','V4'),这里参数固定,设计存贮过程就好办:
CREATE PROCEDURE AProce @V1 varchar(10),@V2 varchar(10), @V3 varchar(10), @V4 varchar(10) 
OUTPUT AS
SELECT 
FROM * FROM TABLEA 
WHERE FILED1 IN (@V1,@V2,@V3,@V4); 如果参数的个数不确定{即:A.FILED1 IN ('V1','V2','V3','V4',...,'Vn')},当要在SQL Server 的存贮过程接收动态参数时如何设计或实现?
  实际需求中,当用户在一个查询条件中进行多项选择,即选择集合{'V1','V2','V3','V4',...,'Vn'}中的子集时,就产生动态参数问题,而复杂的计算要求必须在存贮过程中执行。
  请各位兄弟帮忙想办法。

解决方案 »

  1.   

    @ss varchar(1000);
    @ss='1>0'+' or field1='''+@v1+'''' 
    =号后面的你可以在delphi中生成
      

  2.   

    更正,去掉'1>0'
    @ss varchar(1000);
    @ss='field1='''+@v1+''''+' or'..... 
    =号后面的你可以在delphi中生成
      

  3.   

    To esu(ESU):这个方法只适合于Client端向Server发送动态SQL语句。
    问题来源:因为存贮过程要处理几个表,必须全部在存贮过程实现紧凑计算几万笔记录,然后返回结果集给Client。
    因此,存贮过程必须能接收动态参数。
       “@ss varchar(1000);
        @ss='field1='''+@v1+''''+' or'..... ”
    在这里,@ss 是varchar(1000)类型,在存贮过程中并不能解释为SQL语句。
    SQL SERVER 如果能把 @ss 宏替代为SQL语句就不难了。
        我认为这是个难题。
      

  4.   

    CREATE PROCEDURE AProce @Vx varchar(8000)
    AS
    SELECT 
    FROM * FROM TABLEA 
    WHERE (  ( CHARINDEX(LTRIM(RTRIM(FILED1))+';',@Vx ) >0  ); 
    GO
    ---------------------------------------------------------
    調用:
      exec AProce 'V1'+';'+'V2'+';'+'V3'+';'+'V4'+';'
      

  5.   

    Exec(@SQLComm)在存贮过程不能返回結果,無法處理.
    還是CHARINDEX()的有用,謝謝.