--第一种查询方式(无结果)
declare @sn varchar(900) set @sn='''0000YV00004'',''0001N70004W'''; --print @sn select top 10 * from TB1 where sn in(@sn)
如上代码这样直接执行是查询不到任何结果的,
我用打印参数@sn是显示'0000YV00004','0001N70004W'这种格式,应该可以直接在in里面查询啊!
而用如下代码是可以
declare @sn varchar(900) set @sn='''0000YV00004'',''0001N70004W'''; --print @sn declare @sql varchar(2000) set @sql ='select top 10 * from TB1 where sn in('+@sn+')' exec(@sql)
请问为什么第一中sql不能查询出任何结果呢?谢谢
当@sn只是一个变量时第一种方式又可以查询出来
declare @sn varchar(900) set @sn='0000YV00004'; --print @sn select top 10 * from StoreLabelInfo where sn in(@sn)
di一种方式是将@sn 看作 一个变量, in ('1,2'),而你想要的结果是in(1,2)所以不同
我也试过,要不你就试试在存储过程里面拼SQL试试。。。
我觉得原理应该是这样的,在sqlserver里面,一般生成的语句里面,表名,字段名等都是外面加了一个[]
所以我当时猜测,可能就是这个,所以你你第一个其实执行的是select top 10 * from TB1 where sn in(['0000YV00004','0001N70004W']),这是个人猜测。。。
貌似不是这样呢,我在代码中直接用拼接的参数传入到sql查询语句中,是可以直接返回结果的
string listSn = ""; foreach (KeyValuePair<string, List<string>> de in DicSNInfo) { #region //遍历每个sn sn = de.Key.ToString(); //拼接sn以便直接在sql语句查询 listSn += "'" + sn + "',"; #endregion } if (listSn.IndexOf(",") > 0) { listSn = listSn.TrimEnd(','); //此处将listSn 直接传给一个sql查询语句是可以的。例如 string sqlStr="select * from tab1 where conditions in("+listSn +")" //这样的语句是可以执行的 }
@xiaoqiangzhou: 我当然知道可以。。。
@xiaoqiangzhou: 你的那个最佳答案跟我说的一个意思。。。
@顾晓北: 恩,刚开始没理解,现在理解了,谢谢你哈