各位朋友,存储过程如下:
alter procedure insert_update
@emp_id,@card_id,@emp_name,@insert_update,@return varchar(100) outputas
if @insert_update='update' 
   begin
    update 表 set card_id=@card_id, emp_name=@emp_name whereemp_id=@emp_id
/*
问题1:想在更新记录操作之后,才做一个判断,如果
select emp_name from employee  where emp_name=@emp_name group by emp_name having count(emp_name)>1的话,就提示用户“姓名不能重复!”,然后将刚才的更新操作取消,而且,这个判断必须要在更新记录之后才做,而不是更新记录之前做,请问这个该如何实现,是不是必需要用事务,如果要用事务的话,该怎样写,请各位朋友赐教,谢谢!!!*/
   end

解决方案 »

  1.   

    alter procedure insert_update
    @emp_id,@card_id,@emp_name,@insert_update,@return varchar(100) outputas
    if @insert_update='update'
    begin
    begin transaction
    update 表 set card_id=@card_id, emp_name=@emp_name whereemp_id=@emp_id
    if exists (select 1 from 表 group by emp_name having count(emp_name)>1)
    rollback transaction
    else
    commit transaction
    end
      

  2.   

    提醒:如果不通过这个存储过程,而是手工生成一条emp_name重复的数据,那么通过这个存储过程将永远更新不了数据,直道将这条重复的emp_name被删除或更新为不重复。
      

  3.   

    alter procedure insert_update
    @emp_id,@card_id,@emp_name,@insert_update,@return varchar(100) outputas
    if @insert_update='update'
    begin
    begin transaction
    update 表 set card_id=@card_id, emp_name=@emp_name whereemp_id=@emp_id
    if exists (select 1 from 表 group by emp_name having count(emp_name)>1)
    begin
    rollback transaction
    set @return='姓名不能重复!'
    end
    else
    commit transaction
    end
      

  4.   

    alter procedure insert_update
    @emp_id,@card_id,@emp_name,@insert_update,@return varchar(100) outputas
    if @insert_update='update'
    begin
    begin transaction
    update 表 set card_id=@card_id, emp_name=@emp_name whereemp_id=@emp_id
    if exists (select 1 from 表 group by emp_name having count(emp_name)>1)
    begin
    rollback transaction
    set @return='姓名不能重复!'
    return
    end
    else
    commit transaction
    end
      

  5.   

    再次提醒:如果不通过这个存储过程,而是手工生成一条emp_name重复的数据,那么通过这个存储过程将永远更新不了数据,直道将这条重复的emp_name被删除或更新为不重复。
    这真是一个致命的漏洞,楼主是否改变初衷?
      

  6.   

    直接在 emp_name 列上建立唯一约束,然后启用错误不就行了?不用这么复杂吧?
      

  7.   

    可以用存储过程+事务来处理程序UPDATE,然后用触发器来处理手工UPDATE,代码如下:L
    create table test
    (
      id int primary key,
      name varchar(20)
    )create proc update_test
    @id int,
    @name varchar(20),
    @return varchar(20) output
    as
    begin
        begin tran
        update test set name=@name where id=@id
        if((select count(*) from test where name=@name)>1)
         begin
          rollback tran
          set @return='姓名不能重复'
         end
        else
          commit tran
    end alter trigger autoCheck
    on test
    for update
    as
    begin
        declare @name varchar(20)
        declare @id int
        select @id=id,@name=name from inserted
        if((select count(*) from test where name=@name)>0)
        begin 
          delete from test where id=@id
          insert into test select * from deleted
        end
    end
      

  8.   

    首先感谢楼上的各位朋友的热心回复,但想请教一下“昨夜小楼”,你的话究竟是什么意思,我始终不是很明白是啥意思?能不能再详细一点?
    再次提醒:如果不通过这个存储过程,而是手工生成一条emp_name重复的数据,那么通过这个存储过程将永远更新不了数据,直道将这条重复的emp_name被删除或更新为不重复。
      

  9.   

    各位朋友,首先感谢您们的热心回复,可能我真的将问题复杂化了,假如我想在数据库设置emp_name和card_id这两个字段在任何时候都不能重复,该怎样设置呢?我知道设置唯一值或设置CHECK约束可以实现,但不知道如何在SQL2000的企业管理器里面可以实现,具体的做法如何,希望各位朋友能帮忙写一个具体的详细设置的设置方法,谢谢!!!
      

  10.   

    不好意思,昨晚我思维短路了。if exists (select 1 from 表 group by emp_name having count(emp_name)>1)
    这样只要有重复记录,事务就会回滚。if exists (select 1 from 表 where emp_name=@emp_name group by emp_name having count(emp_name)>1)
    --这样就OK了,抱歉!!
      

  11.   

    假如我想在数据库设置emp_name和card_id这两个字段在任何时候都不能重复,该怎样设置呢?----------------------------------------------
    方法一:唯一索引
    CREATE UNIQUE INDEX 索引名 ON 表名 (emp_name)
    CREATE UNIQUE INDEX 索引名 ON 表名 (card_id)方法二:唯一约束
    ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE NONCLUSTERED (emp_name)
    ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE NONCLUSTERED (card_id)
      

  12.   

    昨夜小楼大哥,我试过用数据库进行约束,但提示不太明显,决定还是用事务来算了,但下面的语句,我测试过记录,明明更新成功了,为什么返回的值还是显示“更新失败”,应该用哪一个,来代替@@rowcount呢?if @insert_update='update'
      begin     begin tran   
          update employee set card_id=@card_id,emp_name=@emp_name
      if exists (select * from employee where card_id=@card_id group by card_id having count(card_id)>1)
        begin
          rollback transaction
          set @message='员工卡号不能重复!'
          return
        end
     else
      commit tran
          if @@rowcount>0
              begin
                  set @message='更新记录成功!'
                  return
              end
          else
              begin
                  set @message='更新记录失败!'
                  return
              end
      
      end
      

  13.   

    declare @count intif @insert_update='update'
    beginbegin tran
    update employee set card_id=@card_id,emp_name=@emp_name
    set @count=@@rowcount
    if exists (select * from employee where card_id=@card_id group by card_id having count(card_id)>1)
    begin
    rollback transaction
    set @message='员工卡号不能重复!'
    return
    end
    else
    commit tran
    if @count>0
    begin
    set @message='更新记录成功!'
    return
    end
    else
    begin
    set @message='更新记录失败!'
    return
    endend