1.
我这样执行就会有错误
=================
这不废话吗?没错误,你分多,来散分啊? :D告诉我们,什么错误,详细的错误信息!!!2。
sql_Str = "select * from [news] where id in(@id)";
===========
 a. sql_Str 声明了吗?
 b. 据我了解,在 sql 2k 版本中,对于 IN 运算,还是无法使用参数的
 c. 只有 拼 sql 语句
 d. sql_Str = String.Format("select * from [news] where id in({0})", idStr);Hope helpful!

解决方案 »

  1.   

    sql_Str 忘了申明了,一大串代码精减掉,忘了加了.....
      

  2.   

    用inner join吧,in用不到index。
      

  3.   

    貌似inner join和in没啥关系吧 - -!
      

  4.   

    DataSet   ds   =   GetInfo("1,2,3,4") 
    //类 
    public   DataSet   GetInfo(string   idStr) 

            sql_Str   =   "select   *   from   [news]   where   id   in(@id)"; 
            SqlParameter[]   Para1   =   new   SqlParameter[1]; 
            Para1[0]   =   new   SqlParameter("@id",   SqlDbType.NVarChar,200); 
            Para1[0].Value   =   idStr; 
            return   SqlHelper.ExecuteDataset(My_config.GetConnstr,   CommandType.Text,   sql_Str,   Para); } 
    -----------------------------
    晕啊!!
    代码和数据库都混了
    !!!!!!!!!!!!!!!!!!!!!!!!
    SQL的部分写成存储过程吧!!
    这样好维护也容易懂
    效率又快
      

  5.   

    DataSet   ds   =   GetInfo("1,2,3,4")  
    //类  
    public   DataSet   GetInfo(string   idStr)  
    {  
            sql_Str   =   "select   *   from   [news]   where   id   in(" + idStr + ")";  
     
            return   SqlHelper.ExecuteDataset(My_config.GetConnstr,   CommandType.Text,   sql_Str,   Para);  }  
      

  6.   

    其实要执行的东西很简单就是一句.(ps,随手敲的,不排除手误)select * from tb where id in(1,2,3,4)那么就成了语句的构造问题了in ()里面是个集合,而楼主的写法是 id in ('1,2,4,3') 是in一个字串. 当然取不到了.
    string sql="select * from tb where id in(@ids)";
    相当于
    string sql="select * from tb wehre id in('1,2,3,4');如果一定要这样以传参数方式,并且ids给字串,那么
    string sql="exec('select * from tb where id in (' + @ids + ')')"
    SqlParameter[]   Para1   =   new   SqlParameter[1]; 
    Para1[0]   =   new   SqlParameter("@id",   SqlDbType.NVarChar,200); 
    Para1[0].Value   =   idStr; 
    return   SqlHelper.ExecuteDataset(My_config.GetConnstr,   CommandType.Text,   sql,   Para1); 相当于执行
    exec('select * from tb where id in (' + '1,2,3,4' + ')')
    如果ids给字串,但不要求以传参数方式执行 那么string sql="select * from tb wehre id in (" + idStr + ")";
    return   SqlHelper.ExecuteDataset(My_config.GetConnstr,   CommandType.Text,   sql,   null); 
    相当于执行
    select * from tb where id in(1,2,3,4)
    如果一定要这样以传参数方式,且ids给字串,且不允许语句用exec来执行,那么
    string sql="select * from tb where charindex(',' + rtrim(id) + ',' , ',' + @ids + ',')>0";
    SqlParameter[]   Para1   =   new   SqlParameter[1]; 
    Para1[0]   =   new   SqlParameter("@id",   SqlDbType.NVarChar,200); 
    Para1[0].Value   =   idStr; 
    return   SqlHelper.ExecuteDataset(My_config.GetConnstr,   CommandType.Text,   sql,   Para1); 
    相当于执行
    select * from tb where charindex(','+rtrim(id)+',',','+'1,2,3,4'+',')>0当然,charindex方式可以改用like完成.写法略
      

  7.   

    上面有朋友提到了用inner join
    那么这里用 inner join 的话,从效率上讲,没有什么效率上的好处string sql="EXEC('SELECT a.* FROM tb a INNER JOIN (SELECT nid=' + REPLACE(@ids,',',' UNION SELECT ') + ') x ON x.nid=a.id')";
    SqlPara.....
    Para1[0].value=idStr;
    ...实际执行的是select a.* from tb a
    inner join
       (select nid=1 union select 2 union select 3 union select 4) x
       on a.id=x.nid
    然而,上面cs代码,拼语句的做法是错的,因为EXEC执的内部不允许使用函数, 这里用了 replace 将 @ids的','换成了' union select'以生成行集.
    所以真要这么用的话, 需要写两步
    string sql="DECLARE @sql VARCHAR(8000);SET @sql='SELECT a.* FROM tb a INNER JOIN (SELECT nid=' + REPLACE(@ids,',',' UNION SELECT ') + ') x ON x.nid=a.id';EXEC(@sql)";
    SqlPara...
    Para1[0].value=idStr;
    ..
    这样做,反而复杂了,效率也没提高. 因为产生的常数行集也是没索引的. 并不比in效率高.
      

  8.   

    我写的1,2,4都是拼字串的方式, 虽然第一种是传@ids参数,但动态语句执行时还是拼参数. 只有第三种不是, 即 charindex那种.
    charindex那种为什么要在前后加','呢,原因很简单tb有字段v
    v
    1
    11
    5
    2
    3本意为: select * from tb where v in('11','2','5')
    如果直接用 charindex(v,'11,2,5')>0 那么 v=1的记录也会被选出来
    加上','后则进行where 过滤时实际将v临时用
    ,1,
    ,11,
    ,5,
    ,2,
    ,3,
    来代表了
    那么 ,1, 明显是不在 ,11,2,5, 中的. 这样就避免了错误的数据选取.