try:update #A set a = 0 
from #A T inner join D on left(T.b,@i)=D.d

解决方案 »

  1.   

    如果在 where 子句中使用参数,会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
      

  2.   

    如果不是临时表,liuqd(liuqd)的解释还可.但楼主的表示临时表#a.
      

  3.   

    liuqd(liuqd) ( ) ,Jpp(不懂装懂) ( )两位兄弟,可以给出解决方案么????
      

  4.   

    在D表中d是否有索引?
    在查询分析器中看看
    ... where left(b,9) in (select d from D)

    ... where left(b,@i) in (select d from D)
    的执行计划有什么不同?
    把后一个语句改为
    ... where exists(select 1 from D where d=left(#A.b,@i))
    速度怎样?
      

  5.   

    既然常数快那就改成动态执行好了:
    declare @i int,@sql varchar(8000)
    set @i = 9
    set @sql='update #A set a = 0 where left(b,'+cast(@i as varchar(10))+') in (select d from D)'
    exec(@sql)
      

  6.   

    pbsql(风云) .谢谢你的方法.
    可以讲讲你这么做的原理么
      

  7.   

    原理就是相当于转换为常数执行,这样便于SQL自动优化