Как решить эту ошибку «ОШИБКА 102 sql state 420000», которая появляется, когда я пытаюсь создать эту процедуру - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь создать процедуру, которая проверяет, существует ли введенный номер (как тип 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.Как убрать эту ошибку и создать процедуру?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Условно ОБНОВИТЬ и посмотреть, произошли ли какие-либо изменения

    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 проверка бесполезна

0 голосов
/ 20 мая 2019

Вы, кажется, хотите, чтобы Def_Tab.AWB был уникальным.Если это так, вы должны позволить базе данных обеспечить целостность данных.Определите уникальное ограничение:

alter table t add constraint unq_def_tab_awb
    unique (awb);

Хранимая процедура не требуется.

Это также проверит значение insert.А поскольку база данных выполняет проверку, вам не нужно беспокоиться о том, действительно ли хранимая процедура вызывается при обновлении таблицы.

...