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'
( @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'
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
......
提示很明确
我也知道系统报主键冲突了,但是该怎么解决呢?我反复看了写的存储过程,感觉不应该出现重复值啊,实在不知道咋办
然后再用变量手动去查数据是否有重复。
然后再用变量手动去查数据是否有重复。
update前
加一select @SupplierTypeID ,@SupplierTypeName, @SuperID, @ReturnValue 语句看看出问题的值,再查看表