在实际应用中有这么一种情况: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里包含大量值的时候。
目前手头没有测试环境,所以特来请教各位。

解决方案 »

  1.   

    #1. 至于你是用字符串拼IN后面的条件,或用临时表,性能差别不大
    #2. 关键是你用IN查询,性能会很差
      

  2.   

    如果你的第二种,像你这么写的话,我看就用第一种算了
    如果改成JOIN 的形式,我看还有的一比 SET @sqlstr=' select a.* from 表a a,#t1 b where a.字段a=b.userid'
      

  3.   


    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的效果实在是不行。
      

  4.   

    IN的性能很差,建议把userid插入临时表,然后用jion会有性能提升