Поле «забывания» хранимой процедуры между оператором update и insert - PullRequest
1 голос
/ 13 января 2020

У нас есть хранимая процедура, которая используется для UPDATE таблицы со значением, вычисленным по существующему столбцу.

Я пытаюсь изменить хранимую процедуру, чтобы также INSERT строка в другой таблица, использующая значение этого же столбца, но столбец отклоняется синтаксическим анализатором как недопустимое имя столбца.

Вот сокращенная версия кода. Как указано, sequence_no известен хранимой процедуре и заканчивается на reference_no. т. е. UPDATE работает, но INSERT не работает.

ALTER PROCEDURE [dbo].[update_references]
AS
    -- Original contents:
    UPDATE table1
    SET reference_no = sequence_no
    FROM table1 t1 WITH (NOLOCK)
    LEFT OUTER JOIN proptable p1 WITH (NOLOCK) ON t1.checkval = p1.checkval
    WHERE p1.fruit = 'apple'

    -- I have added the INSERT 
    INSERT INTO table2 (next_seq_no)
    VALUES (sequence_no)    

* * * * * * * * * * * * * * sequence_no подчеркнуто красным в SSMS.

1 Ответ

1 голос
/ 13 января 2020

Оператор вставки в вашем коде ничего не знает о предыдущем обновлении, поэтому вы не можете ссылаться на случайные столбцы из этого и ожидать, что они все еще будут находиться в области видимости. Самый простой способ сделать это - использовать предложение OUTPUT.

UPDATE table1
SET reference_no = sequence_no
OUTPUT INSERTED.reference_no INTO table2 (next_seq_no)
FROM table1 t1
LEFT OUTER JOIN proptable p1 ON t1.checkval = p1.checkval
WHERE p1.fruit = 'apple'
...