none
奇怪的错误,不是where再取数据(cast(Keys as int))吗? RRS feed

  • 问题

  • begin tran
    create table #A(AId int,ItemType int)
    create table #B(A_Id int,Keys varchar(200))

    insert #A
    select 1,3 union all select 2,1 union all select 3,1 union all select 4,1

    insert #B
    select 1,'转换'

    select Keys
    from #A a join #B b on a.AId=b.A_Id
    where a.ItemType=1--没有结果

    select cast(Keys as int)
    from #A a join #B b on a.AId=b.A_Id
    where a.ItemType=1

    drop table #A
    drop table #B
    rollback

    --奇怪的错误,不是where再取数据(cast(Keys as int))吗?ItemType=1时,并没有结果却执行了cast(Keys as int)
    ,ItemType=3时,Keys才等于'转换'呀。
    --不是先where再cast(Keys as int)吗,这里好似是相反呢?

    消息 245,级别 16,状态 1,第 10 行
    在将 varchar 值 '转换' 转换成数据类型 int 时失败。

    2009年12月3日 13:35

答案

  • 查询优化器决定执行的顺序, 则不是按照我们理解的顺序
    你可以手工控制一下执行计划, 就不报错了

    select cast(Keys as int)
    from #A a join #B b on a.AId=b.A_Id
    where a.ItemType=1
    option(
    	force order
    )
    
    • 已标记为答案 SQL STUDIO 2009年12月4日 6:18
    2009年12月4日 4:26
  • 加個表提示,改變數據庫引擎的執行順序就行了{ LOOP | HASH | MERGE | REMOTE }

    如:
    select cast(Keys as int)
    from #A a inner HASH join #B b on a.AId=b.A_Id
    where a.ItemType=1
    
    
    select cast(Keys as int)
    from #A a inner MERGE join #B b on a.AId=b.A_Id
    where a.ItemType=1

    ROY WU(吳熹 )
    • 已标记为答案 SQL STUDIO 2009年12月4日 6:18
    2009年12月4日 4:42
    版主

全部回复

  • Sql checks type matching first.
    2009年12月3日 13:57
  • 查询优化器决定执行的顺序, 则不是按照我们理解的顺序
    你可以手工控制一下执行计划, 就不报错了

    select cast(Keys as int)
    from #A a join #B b on a.AId=b.A_Id
    where a.ItemType=1
    option(
    	force order
    )
    
    • 已标记为答案 SQL STUDIO 2009年12月4日 6:18
    2009年12月4日 4:26
  • 加個表提示,改變數據庫引擎的執行順序就行了{ LOOP | HASH | MERGE | REMOTE }

    如:
    select cast(Keys as int)
    from #A a inner HASH join #B b on a.AId=b.A_Id
    where a.ItemType=1
    
    
    select cast(Keys as int)
    from #A a inner MERGE join #B b on a.AId=b.A_Id
    where a.ItemType=1

    ROY WU(吳熹 )
    • 已标记为答案 SQL STUDIO 2009年12月4日 6:18
    2009年12月4日 4:42
    版主