如果 是2005 ,看看这个http://blog.csdn.net/happyflystone/archive/2008/10/05/3017655.aspx

解决方案 »

  1.   

    to happyflystone:
    也就是说在2000下我这样做是有必要的么?
      

  2.   

    如果ID是主键,担心是多余的Declare @tb table([id] int);
    insert into @tb([id]) select [id] from [table] where [flag]=0;
    update a set [flag]=1 From [table] where flag = 0;
    select a.* from [table] as a join @tb as b on a.[id]=b.[id];
      

  3.   

    有必要。如果你真的有这样的需求:
    1.更新flag
    2.将更新的记录返回
      

  4.   


    1,从某表中选择出flag为0的记录 
    2,并将所选数据中的FLAG字段变为1 
    --- 如果仅是完成以上的工作,那么update a set [flag]=1 From [table] where flag = 0;一句就够了如果你想知道这次更新了哪些ID的flag
    1、如果更新时表有什么字段表明此次的更新,比如时间、更新人能唯一标识此次更新的,那也是只要上面一句话,你的操作是多余的
    2、如果你仅是更新一个flag,然后更新完了要列出此次的更新记录并ID是唯一标识行时,你的操作是可行的,
    3、如果你的ID不唯一,那么你以上的工作肯定是可能出现N+1的情况的
      

  5.   

    能具体点吗?
    你这样写会不会出现。你插入@tb的时候有n条记录,而更新的时候却更新了n+1条记录,而最后你又只选择了n条记录的情况发生呢?
      

  6.   


    会的,如果你的ID是唯一标识行的列,那么你的操作是必须的,如果你使用2005的话,就可以用output .. into..方法
      

  7.   

    我说具体点吧
    1.我要更新数据库中FLAG=0的所有记录
    2.我要将这些FLAG=0的记录都选择出来进行一些其他操作。此表的数据插入很频繁
    如果我这样写
    select * from table flag=0
    update table set flag=1 where flag=0;我担心的是在select之后,由于新数据的插入而导致update更新了更多的记录,这样数据就不统一了。所以我在用了的中间的@TB来存储该次要更新和选择出来的记录
      

  8.   

    是的,你的担心是存在的(当然你用锁来操作时那不在讨论的范围)
    同时你一楼的操作方法必须保证ID是唯一的,否则,你的select a.* from [table] as a join @tb as b on a.[id]=b.[id];这一句仍然会有N+M的情况出现