在实际应用中有这么一种情况:declare @userid varchar(2000),
@sqlstr varchar(4000)
set @userid='101,102,103,104,......199'现在要使用动态SQL根据@userid所包含的值去表A查找记录,有两种常用方法:
方法1:set @sqlstr='select * from 表a where 字段a in ('+@userid+')'方法2:CREATE TABLE #T1
(
userid INT
) SET @userid=REPLACE(@userid,',',' UNION ALL SELECT ')
EXEC ('INSERT INTO #T1 SELECT ' + @userid) SET @sqlstr=' select * from 表a where 字段a in (
SELECT userid
FROM #T1
)'
我想请教的是,这两种方法哪种性能最好?尤其是当@userid里包含大量值的时候。
目前手头没有测试环境,所以特来请教各位。
@sqlstr varchar(4000)
set @userid='101,102,103,104,......199'现在要使用动态SQL根据@userid所包含的值去表A查找记录,有两种常用方法:
方法1:set @sqlstr='select * from 表a where 字段a in ('+@userid+')'方法2:CREATE TABLE #T1
(
userid INT
) SET @userid=REPLACE(@userid,',',' UNION ALL SELECT ')
EXEC ('INSERT INTO #T1 SELECT ' + @userid) SET @sqlstr=' select * from 表a where 字段a in (
SELECT userid
FROM #T1
)'
我想请教的是,这两种方法哪种性能最好?尤其是当@userid里包含大量值的时候。
目前手头没有测试环境,所以特来请教各位。
解决方案 »
- SQL SERVER 2005基础知识问题
- SQL SERVER2005存储过程解析
- 菜鸟提问!! 如何能个得到上个月的第一天和最后一天的日期,比如说:今天是2006-3-1,我想得到2006-2-1 00:00:000和2006-2-28 23:59:000
- 登录权限与数据表所有者之间的关系,请看问题。设计asp语句
- >>>有个字段是自动增长的,该怎么查记录?<<<
- 无法在sql05一个表中插入和更新数据
- “sql server 安装程序意外失败。
- 数据库导入导出的时候,其中的存储过程为什么不能够随着表,视图导入导出?
- SQL 2000 英文版不支持中文全文检索??
- 壹?ACCESS2000的数据库有几行坏了,无法用ACCESS修复/无法删除,一读到该行ACCESS就直接退出,怎么办?
- 【【【向excel中的一个格里写入数据】】】
- 如下简单储存过程能被SQL注入吗?
#2. 关键是你用IN查询,性能会很差
如果改成JOIN 的形式,我看还有的一比 SET @sqlstr=' select a.* from 表a a,#t1 b where a.字段a=b.userid'
declare @table table (id int,col varchar(1))
insert into @table
select 101,'a' union all
select 201,'b' union all
select 301,'c' union all
select 409,'d'declare @userid varchar(2000),
@sqlstr varchar(4000)
set @userid='201,102,301,104,199'SELECT * FROM @table
WHERE CHARINDEX(','+CAST(id AS VARCHAR(4))+',',','+@userid+',')>0
/*
id col
----------- ----
201 b
301 c
*/这种设计,性能都好不了哪去,但是in的效果实在是不行。