更新中的case语句中的Sybase 15子字符串错误

时间:2010-10-21 13:15:00

标签: case sybase-ase

在Adaptive Server Enterprise / 15.0.3 / EBF上运行17157 ESD#3 / P / x86_64 / Enterprise Linux / ase1503 / 2726/64位/ FBO /

以下代码永远不应该进入子字符串大小写,但是我遇到了Sybase Error 536。

这是一种优化形式,它评估所有路径,而不管实际值是什么?

我们可以解决这个问题但想知道原因吗?

declare @test float
declare @test1 char(10) 

create table #TestTable
(
    Dno int,
    Code varchar(10)    
)

Insert into #TestTable values (1,'code')
set @test1 = 'ddd'
print 'test'
select  @test = case
        when (1=1) then 2
        when (1=0) then (select Dno FROM  #TestTable  WHERE Code = substring('abc',1,charindex(@test1,'a')-1) AND Dno = 1)
        else 10
       end

       select @test

drop table #TestTable

1 个答案:

答案 0 :(得分:1)

您可能误解了优化查询的性质和要求。显然你认为有时候应该执行一些“代码路径”,而不是其他代码路径。无法从优化器的注视中排除编码的“代码路径”。虽然它优化了查询,但在处理SQL方面,它只是一个编译器,而不是一个优化器。

当优化查询时,确定整个查询路径(在选择一个之前预留许多可能性的事实),评估,检查和编译。 CASE无关紧要。为了运行任何子查询,必须对子查询进行求值和编译。您的特定子查询永远不会执行的事实与代码无关。

出于多种原因,在程序之外放置永远不会执行的代码是个好主意。查询树中的分支是否将被执行,是在运行时的确定。人类可以看到它永远不会被激活,但优化者还没有那个级别的AI(当优化者可以排除这样的代码时,这将是一个盛大的日子。)