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!
我这样执行就会有错误
=================
这不废话吗?没错误,你分多,来散分啊? :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!
//类
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的部分写成存储过程吧!!
这样好维护也容易懂
效率又快
//类
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); }
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完成.写法略
那么这里用 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效率高.
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, 中的. 这样就避免了错误的数据选取.