我正在尝试创建一个过程,该过程检查是否已经存在(作为NVARCHAR类型(。如果存在,则进行更新,否则将错误丢给用户。但是无法创建该过程,因为一旦我执行命令错误102/156 SQL状态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
fyi我使用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
上的值。而且由于数据库正在进行检查,因此您不必担心有人在更新表时是否实际调用了存储过程。