繁体   English   中英

当我尝试创建此过程时,如何解决此错误“ ERROR 102 sql state 420000”

[英]How to solve this error “ERROR 102 sql state 420000” which comes up when I try to create this procedure

我试图创建一个过程来检查输入的数字(作为nvarchar类型)是否已经存在。 如果存在,则会进行更新,否则会向用户抛出错误。 但是无法创建该过程,因为一旦执行命令ERROR 102/156 SQL STATE 42000,就会出现该过程。

CREATE PROCEDURE UpdateAWBUnique
(
    @AWB as nvarchar,
    @Internal as nvarchar
)
AS
BEGIN
    SET NOCOUNT ON
    if((SELECT count(*) From Def_tab WHERE AWB=@AWB) == 0) 
    BEGIN
        UPDATE Def_tab SET AWB= @AWB
        where Internal=@Internal
    END
    ELSE
    BEGIN
        PRINT 'Already Exits'
    END
END
GO

仅供参考,我使用Microsoft SQL Server。 如何清除此错误并创建程序?

有条件地更新并查看是否发生任何更改

    UPDATE Def_tab 
    SET AWB = @AWB
    WHERE Internal = @Internal 
         AND NOT EXISTS (SELECT 1 FROM Def_tab t WHERE t.AWB= @AWB)
    IF (@@ROWCOUNT = 0)
        PRINT 'Already Exits'

否则,在并发环境中,可能会在

if((SELECT count(*) From Def_tab WHERE AWB=@AWB) == 0) 

BEGIN
    UPDATE Def_tab SET AWB= @AWB

使if检查无效

您似乎希望Def_Tab.AWB是唯一的。 如果是这样,则应让数据库强制执行数据完整性。 定义唯一约束:

alter table t add constraint unq_def_tab_awb
    unique (awb);

不需要存储过程。

这还将检查insert上的值。 并且由于数据库正在执行检查,因此您不必担心有人更新表时是否实际调用了存储过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM