none
关于用select赋值的些疑问 RRS feed

  • 问题

  • 我只想搞清楚这个背后运行机制是怎样的。

    假如有一张数据表,现在从表中取一个字段,赋给一个变量,我用表的id号来测试

    declare @theid int

    select @theid=id from table

    发现@theid始终都是返回table最大的id号,这个赋值是怎样实现的?是吧整个表循环一边,然后赋最后一个值,还是直接提取最后一个值给到@theid,如果加了一个orderby desc 那么返回的是最小。

     

     

     

    2010年8月28日 7:25

答案

  • 不能保证始终返回最大的 因为你没有使用order by 指定显示顺序...

     

    这里的@theid会被最后一个记录行的id赋值....应该是依次显示下来 到最后一个没有记录时候显示此时的变量值..

    • 已标记为答案 fangyanqin 2010年9月1日 0:40
    2010年8月28日 15:35
  • 赋值的过程, 一般是逐条赋值, 然后保留结果集的最后一条, 但在某些情况下, 查询优化器可能会指示省略掉逐条这个过程, 直接取最后一个.

    你可以把值累加测试一下(表的数据不要太多, 否则可能溢出), 一般情况下, 会累加所有的值, 但有时可能累加里面只有最后一条记录的值:

    declare @theid int
    SET @theid = 0;
    select @theid=@theid + id from table;

     

     

    • 已标记为答案 fangyanqin 2010年9月1日 0:41
    2010年8月30日 4:42

全部回复

  • 这个赋值的结果是 select 结果 的最后一个记录的值

    通常这个操作是没有意义的,可能会导致你的赋值结果不是你预期的结果。

     

     


    family as water
    2010年8月28日 12:27
  • 不能保证始终返回最大的 因为你没有使用order by 指定显示顺序...

     

    这里的@theid会被最后一个记录行的id赋值....应该是依次显示下来 到最后一个没有记录时候显示此时的变量值..

    • 已标记为答案 fangyanqin 2010年9月1日 0:40
    2010年8月28日 15:35
  • 结果集的最后一条
    More: blog.csdn.net/happyflystone
    2010年8月29日 11:22
  • 结果集的最后一条

    至于这个最后, 取决于查询中有没有 ORDER BY, 有的话, 按这个顺序, 没有的话, 结果不可控, 一般是取决于实际的数据读取顺序(没有并发读取的情况)

    2010年8月30日 4:39
  • 赋值的过程, 一般是逐条赋值, 然后保留结果集的最后一条, 但在某些情况下, 查询优化器可能会指示省略掉逐条这个过程, 直接取最后一个.

    你可以把值累加测试一下(表的数据不要太多, 否则可能溢出), 一般情况下, 会累加所有的值, 但有时可能累加里面只有最后一条记录的值:

    declare @theid int
    SET @theid = 0;
    select @theid=@theid + id from table;

     

     

    • 已标记为答案 fangyanqin 2010年9月1日 0:41
    2010年8月30日 4:42