问题描述
我想用sql命令参数传值,不用字符串拼出来,那位仁兄,能帮我吗DataSetds=GetInfo("1,2,3,4")//类publicDataSetGetInfo(stringidStr){sql_Str="select*from[news]whereidin(@id)";SqlParameter[]Para1=newSqlParameter[1];Para1[0]=newSqlParameter("@id",SqlDbType.NVarChar,200);Para1[0].Value=idStr;returnSqlHelper.ExecuteDataset(My_config.GetConnstr,CommandType.Text,sql_Str,Para);}
解决方案
解决方案二:
我这样执行就会有错误
解决方案三:
1.我这样执行就会有错误=================这不废话吗?没错误,你分多,来散分啊?:D告诉我们,什么错误,详细的错误信息!!!2。sql_Str="select*from[news]whereidin(@id)";===========a.sql_Str声明了吗?b.据我了解,在sql2k版本中,对于IN运算,还是无法使用参数的c.只有拼sql语句d.sql_Str=String.Format("select*from[news]whereidin({0})",idStr);Hopehelpful!
解决方案四:
sql_Str忘了申明了,一大串代码精减掉,忘了加了.....
解决方案五:
对于in参数,应该只能用拼接字符串处理
解决方案六:
mark学习我说呢in老是出错原来是这个原因
解决方案七:
对IN参数只能用拼接字符串处理?mark下.
解决方案八:
对于in参数,只能用拼接字符串处理
解决方案九:
不过IN还是少用的好
解决方案十:
顶楼上的,少用in
解决方案十一:
用innerjoin吧,in用不到index。
解决方案十二:
貌似innerjoin和in没啥关系吧--!
解决方案十三:
用CharIndex
解决方案十四:
DataSetds=GetInfo("1,2,3,4")//类publicDataSetGetInfo(stringidStr){sql_Str="select*from[news]whereidin(@id)";SqlParameter[]Para1=newSqlParameter[1];Para1[0]=newSqlParameter("@id",SqlDbType.NVarChar,200);Para1[0].Value=idStr;returnSqlHelper.ExecuteDataset(My_config.GetConnstr,CommandType.Text,sql_Str,Para);}-----------------------------晕啊!!代码和数据库都混了!!!!!!!!!!!!!!!!!!!!!!!!SQL的部分写成存储过程吧!!这样好维护也容易懂效率又快
解决方案十五:
DataSetds=GetInfo("1,2,3,4")//类publicDataSetGetInfo(stringidStr){sql_Str="select*from[news]whereidin("+idStr+")"; returnSqlHelper.ExecuteDataset(My_config.GetConnstr,CommandType.Text,sql_Str,Para);}
解决方案:
jf
解决方案:
其实要执行的东西很简单就是一句.(ps,随手敲的,不排除手误)select*fromtbwhereidin(1,2,3,4)那么就成了语句的构造问题了in()里面是个集合,而楼主的写法是idin('1,2,4,3')是in一个字串.当然取不到了.stringsql="select*fromtbwhereidin(@ids)";相当于stringsql="select*fromtbwehreidin('1,2,3,4');如果一定要这样以传参数方式,并且ids给字串,那么stringsql="exec('select*fromtbwhereidin('+@ids+')')"SqlParameter[]Para1=newSqlParameter[1];Para1[0]=newSqlParameter("@id",SqlDbType.NVarChar,200);Para1[0].Value=idStr;returnSqlHelper.ExecuteDataset(My_config.GetConnstr,CommandType.Text,sql,Para1);
相当于执行exec('select*fromtbwhereidin('+'1,2,3,4'+')')
如果ids给字串,但不要求以传参数方式执行那么stringsql="select*fromtbwehreidin("+idStr+")";returnSqlHelper.ExecuteDataset(My_config.GetConnstr,CommandType.Text,sql,null);
相当于执行select*fromtbwhereidin(1,2,3,4)
如果一定要这样以传参数方式,且ids给字串,且不允许语句用exec来执行,那么stringsql="select*fromtbwherecharindex(','+rtrim(id)+',',','+@ids+',')>0";SqlParameter[]Para1=newSqlParameter[1];Para1[0]=newSqlParameter("@id",SqlDbType.NVarChar,200);Para1[0].Value=idStr;returnSqlHelper.ExecuteDataset(My_config.GetConnstr,CommandType.Text,sql,Para1);
相当于执行select*fromtbwherecharindex(','+rtrim(id)+',',','+'1,2,3,4'+',')>0
当然,charindex方式可以改用like完成.写法略
解决方案:
上面有朋友提到了用innerjoin那么这里用innerjoin的话,从效率上讲,没有什么效率上的好处stringsql="EXEC('SELECTa.*FROMtbaINNERJOIN(SELECTnid='+REPLACE(@ids,',','UNIONSELECT')+')xONx.nid=a.id')";SqlPara.....Para1[0].value=idStr;...
实际执行的是selecta.*fromtbainnerjoin(selectnid=1unionselect2unionselect3unionselect4)xona.id=x.nid
然而,上面cs代码,拼语句的做法是错的,因为EXEC执的内部不允许使用函数,这里用了replace将@ids的','换成了'unionselect'以生成行集.所以真要这么用的话,需要写两步stringsql="DECLARE@sqlVARCHAR(8000);SET@sql='SELECTa.*FROMtbaINNERJOIN(SELECTnid='+REPLACE(@ids,',','UNIONSELECT')+')xONx.nid=a.id';EXEC(@sql)";SqlPara...Para1[0].value=idStr;..
这样做,反而复杂了,效率也没提高.因为产生的常数行集也是没索引的.并不比in效率高.
解决方案:
对IN参数只能用拼接字符串处理?
解决方案:
我写的1,2,4都是拼字串的方式,虽然第一种是传@ids参数,但动态语句执行时还是拼参数.只有第三种不是,即charindex那种.charindex那种为什么要在前后加','呢,原因很简单tb有字段vv111523本意为:select*fromtbwherevin('11','2','5')如果直接用charindex(v,'11,2,5')>0那么v=1的记录也会被选出来加上','后则进行where过滤时实际将v临时用,1,,11,,5,,2,,3,来代表了那么,1,明显是不在,11,2,5,中的.这样就避免了错误的数据选取.
解决方案:
顶2楼
解决方案:
jf