+ -
当前位置:首页 → 问答吧 → where in () 的问题

where in () 的问题

时间:2011-12-27

来源:互联网

select * from tb where id in (1,2)时候正确

declare @d ='1,2,3'

select * from tb where id in (@d ) 就会出错

有没有好办法能 让 select * from tb where id in (@d ) 也能正确啊

在存取过程中执行的 

我不想用 select * from tb where charindex(','+ltrim( id )+',', @d )>0 的方式 感觉这样很慢

作者: ayun00   发布时间: 2011-12-27

SQL code
exec('select * from tb where id in ('+@d +')')

作者: qianjin036a   发布时间: 2011-12-27

createproc t
@str varchar(32)
as
declare @sql varchar(max)
set @sql='select * from t_goods where base_goods_id in('+@str+')'
print (@sql)
exec (@sql)
exec t '18148,18147,18146'

作者: zhaowenzhong   发布时间: 2011-12-27

exec后 sql还能对语句进行优化吗?
我这里是简化了的代码 实际代码比较复杂的

作者: ayun00   发布时间: 2011-12-27

引用 3 楼 ayun00 的回复:

exec后 sql还能对语句进行优化吗?
我这里是简化了的代码 实际代码比较复杂的


一样的,关键在语句写得好不好.不过,用 exec 可能有会另外占用一些时间.

作者: qianjin036a   发布时间: 2011-12-27

exec会产生很多即席的计划
如有可能
将传入的ID放到表里
然后与原表做连接查询

仅供参考

作者: wufeng4552   发布时间: 2011-12-27

declare @d ='1,2,3'

串的效率都不会太高

作者: fredrickhu   发布时间: 2011-12-27

建一个临时表?

郁闷 工期太急了 没时间对这些方案 都来做个效率测试

引用 5 楼 wufeng4552 的回复:
exec会产生很多即席的计划
如有可能
将传入的ID放到表里
然后与原表做连接查询

仅供参考

作者: ayun00   发布时间: 2011-12-27

引用 5 楼 wufeng4552 的回复:

exec会产生很多即席的计划
如有可能
将传入的ID放到表里
然后与原表做连接查询

仅供参考

学习。

作者: Beirut   发布时间: 2011-12-27

引用 5 楼 wufeng4552 的回复:

exec会产生很多即席的计划
如有可能
将传入的ID放到表里
然后与原表做连接查询

仅供参考

学习!

作者: hebeishimeng   发布时间: 2011-12-27

这个肯定会出错的啊,你的in后面是个串,那么它匹配的不是分开的串里面的分开数值,而是整个串,也就是它查的是'1,2,3'这个数据,而不是查'1','2','3'。两者意义不同的除非试试用单引号转换把变量改为分开的数据串试试

作者: qingshangwuheng   发布时间: 2011-12-27