SQL SERVER2005:SELECT下的UPDATE问题

SQL SERVER2005:SELECT下的UPDATE问题

一、对于查询的结果,加计数和(或已用)标志

在一些处理中,经常会碰到:当对一组数据进行SELECT处理后,需要对这组数据加标志,表示该组数据已被读取,这样,下一次就可以不需要重复读相同的数据了。

然而,我们发现,解决这样问题,却是一个头痛的事。

我们知道,在SELECT命令中,是不能使用UPDATE语句的。因此,若按通常的想法,想解决这个问题,分成几步进行:

1、先将数据进行UPDATE;

2、再进行SELECT。

然而我们发现,由于步骤1中,已将数据加了标志,步骤2就无法获得正确的结果。

或者这样:

1、先进行SELECT

2、再进行UPDATE

我们发现,UPDATE会产生一个结果值,这个结果值中存有UPDATE的记录数。则SELECT获得的结果集就不存在了。

看来这有点麻烦。

但是,在SQL SERVER 2005中,应该有解决的办法。果然。

在SQL SERVER 2005中的UPDATE中提供了一条OUTPUT语句,该语句的重要作用是:

你可以使用OUTPUT中的DELETED.*,获得进行UPDATE处理之前的数据;

你也可以使用OUTPUT中的INSERTED.*,获得进行UPDATE处理之后的数据。

太妙了!

例如,我们有如下的表(TABLE):

序号(ID) 学生姓名(NAME) 学生成绩(CJ) 读次数(CS)

1   张三   90                0

2   李四   70                0

3   王五   80                0

我们希望,这些成绩,只能被读(查询)50次。我们就可以用以上的命令来实现了。

UPDATE table SET cj=cj+1

OUTPUT DELETED.id,DELETED.name,DELETED.cj

WHERE cs<50

看看,简单不简单。

但是,对于多表查询情况下的UPDATE方法,还需要再找办法。

二、数据变化时如何重新给计数器清空

如上所述,当读取一次数据后,则进行计数。但是,我们更希望,当某些数据发生变化时(比如分数等),则将计数器清零,以便用户可以重新读取。这就涉及到UPDATE中的SET语句使用比较命令的问题。

也就是说,当我们向某条记录中进行数据修改时,需要判断修改的某个项是否与原数据相同,如果不同,则将标志清零,如果相同,则仍保持原计数值。

DECLARE @cj INT
SET @cj=65
UPDATE table SET cs=CASE WHEN cj=@cj THEN cj ELSE 0 END,cj=@cj
WHERE ID=1

注意CASE语句的要求:如果没有ELSE时,当条件不成立时,返回的是空值,而不是不处理。

 注意:OUTPUT子句是SQL Server 2005为INSERT、DELETE、UPDATE 所新增的。

 

  三、SQL SERVER 2000的解决方案

  虽然在SQL SERVER 2005下可以方便的解决,但是,如果使用了2000,该问题也一样需要解决。

  具体构想为:1、创建临时表;2、根据条件,将满足条件的数据存入临时表中;3、执行UPDATE,条件是满足临时表中相关的数据;4、输出临时表;5、删除临时表。

  1、创建临时表。

  2、将满足条件的记录写入临时表中。

 

posted @ 2011-11-10 15:06  rob_2010  阅读(332)  评论(0)    收藏  举报