【问题标题】:Sybase 15 substring error in a case statement on update更新时 case 语句中的 Sybase 15 子字符串错误
【发布时间】:2013-03-14 14:41:26
【问题描述】:

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

下面的代码不应该输入子字符串大小写,但是我会看到一个 Sybase 错误 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

【问题讨论】:

  • 更新:似乎只有在 case 语句中存在子查询时才会出错....仍然不知道为什么它选择在这种情况下显然不会命中代码路径时进行评估。
  • 请检查答案并推进问题

标签: case sap-ase


【解决方案1】:

是的。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多