CREATE PROCEDURE dbo.tab_ST_Update
  (   @SupplierTypeID varchar(50),      --供应商类型ID
     @SupplierTypeName    varchar(50),        --供应商类型名称
     @SuperID      varchar(50),      --供应商类型上级ID
    @ReturnValue     int   OutPut         --执行结果(VB组件中自定义枚举值)  
    )
 AS
  Declare @ErrNo int     --定义变量,保存错误号
  Begin Transaction            --开始事务
  
   /*更新记录,判断参数传递的新ID是否与旧ID一致,此处给@ReturnValue传递一个旧ID值*/
    if @SupplierTypeID=@ReturnValue
begin
            Update tab_ST set SupplierTypeName=@SupplierTypeName,SuperID=@SuperID
where SupplierTypeID=@SupplierTypeID
end
    /*当新旧ID不一致时,利用@ReturnValue的旧ID值与数据库中的相应数据进行匹配*/
    else
begin
    Update tab_ST set SupplierTypeID=@SupplierTypeID,SupplierTypeName=@SupplierTypeName,SuperID=@SuperID
where SupplierTypeID=@ReturnValue
end       /*记录当前的错误号*/
       select @ErrNo=@@Error      /*输出参数*/
      if @ErrNo=0          --没有发生错误
         begin
           select @ReturnValue=0
         end
      else if @ErrNo=2627           --违反唯一约束
        begin
          Rollback Transaction           --回滚事务
          select @ReturnValue=1
          Return                        --返回主调程序
        end
      else                      --发生其他错误
        begin
          Rollback Transaction            --回滚事务
          select @ReturnValue=2
          Return                      --返回主调程序
        end
   
  Commit Transaction         --提交事务
GO
表中现有数据
ID        Name         SuperID
1 主供应商           0
2 次供应商           0
3 主包装商           0
02 辅助供应商  2exec dbo.tab_st_update '01','辅助供应商','1','02'服务器: 消息 2627,级别 14,状态 1,过程 tab_ST_Update,行 21
违反了 PRIMARY KEY 约束 'PK_SupplierType'。不能在对象 'tab_ST' 中插入重复键。
语句已终止。
在查询分析器中用exec调用存储过程时,报错信息如上,错误是怎么产生的啊?我没用insert语句啊,如果直接用update语句在查询分析器中使用,
又可以成功执行,语句如下
update tab_st set suppliertypeid='01',suppliertypename='辅助供应商',superid='2' where suppliertypeid='02'

解决方案 »

  1.   

    你给的单独执行语句并不一定是你实际执行的值,你可以这样修改,然后看看变量的值:
    CREATE PROCEDURE dbo.tab_ST_Update 
      (  @SupplierTypeID varchar(50),      --供应商类型ID 
        @SupplierTypeName    varchar(50),        --供应商类型名称 
        @SuperID      varchar(50),      --供应商类型上级ID 
        @ReturnValue    int  OutPut        --执行结果(VB组件中自定义枚举值)  
        ) 
    AS 
      Declare @ErrNo int    --定义变量,保存错误号 
      Begin Transaction            --开始事务 
      
      /*更新记录,判断参数传递的新ID是否与旧ID一致,此处给@ReturnValue传递一个旧ID值*/ 
        if @SupplierTypeID=@ReturnValue 
    begin 
                Update tab_ST set SupplierTypeName=@SupplierTypeName,SuperID=@SuperID 
    where SupplierTypeID=@SupplierTypeID 
    end 
        /*当新旧ID不一致时,利用@ReturnValue的旧ID值与数据库中的相应数据进行匹配*/ 
        else 
    begin 
        print @SupplierTypeID   --打印
        print @SupplierTypeName --打印
        print @SuperID  --打印
        Update tab_ST set SupplierTypeID=@SupplierTypeID,SupplierTypeName=@SupplierTypeName,SuperID=@SuperID 
    where SupplierTypeID=@ReturnValue 
    end 
    ......
      

  2.   

    违反了 PRIMARY KEY 约束 'PK_SupplierType'。不能在对象 'tab_ST' 中插入重复键。
    提示很明确
      

  3.   

    CN-SQL兄,我在过程里加了你给出的意见,添加了三个打印语句,但是在哪里看变量的值啊,系统还是报错,没有显示出变量的值
    我也知道系统报主键冲突了,但是该怎么解决呢?我反复看了写的存储过程,感觉不应该出现重复值啊,实在不知道咋办
      

  4.   

    抱错的前面,就应该会有打印,如果没有打印,则是空值,你要么可以先把UPDATE语句给注释掉,先打印出来变量
    然后再用变量手动去查数据是否有重复。
      

  5.   

    抱错的前面,就应该会有打印,如果没有打印,则是空值,你要么可以先把UPDATE语句给注释掉,先打印出来变量
    然后再用变量手动去查数据是否有重复。
      

  6.   

    update后出现主键重复
    update前
    加一select @SupplierTypeID ,@SupplierTypeName, @SuperID, @ReturnValue 语句看看出问题的值,再查看表
      

  7.   

    恩,感谢SQL和小陈,问题我找到了的,数据类型不一致造成的,改了后现在正常了,结帖散分