Хранимая процедура SQL Server получает один столбец из последнего выполненного оператора select - PullRequest
0 голосов
/ 02 ноября 2019

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

В качестве примера

create procedure myproc
as
begin
    select col1, col2, col3 
    from table

    update table 
    set col5 = value 
    where col1 = <value of col1 from above select query>
end

Я читал о решении использовать подзапрос для получения столбца из последнего запроса, но я ищу лучший способ, если таковой имеется

Изменить для большей ясности

 create table emp
(id int, name varchar(30),age int,status bit)

insert into emp values (1,'sam',23,null)
insert into emp values (2,'mike',33,null) 
insert into emp values (3,'marc',42,null) 



create procedure myproc as
begin
select top 1 id,name from emp where age>30 order by id --it will return row number 2 with id "2"
update emp set status='1' where id =2 -- "2" is the id we got as a result of above select query
end

Я хочу получить результат запроса select, а также выполнить обновление после запроса select

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

Если вы хотите что-то обновить и получить данные, хранящиеся в таблице ДО обновления, вы можете использовать простой запрос UPDATE с OUTPUT

WITH SRC AS
(
    SELECT TOP(1)
            id
        ,   name
        ,   status
    FROM
        emp
    WHERE
            age > 30
    ORDER BY
            id ASC
)
UPDATE
    SRC
SET
        SRC.status = 1
OUTPUT
        Deleted.id
    ,   Deleted.name
    ,   Deleted.status  AS StatusBefore -- status BEFORE the update
    ,   Inserted.status AS StatusAfter  -- status AFTER the update
;

Sidenote : Этот вопрос обновлялся несколько раз, этот ответ основан на обновлении, в котором вы добавили определение таблицы emp и некоторую расплывчатую реализацию вашей бизнес-логики ( revision 6 ).

1 голос
/ 02 ноября 2019

Вы, кажется, хотите:

create procedure myproc
as
begin
    update table 
        set col5 = value 
        where col1 in (select col1 from table)
end;

Обратите внимание, что ваш исходный запрос не имеет фильтрации, поэтому это эквивалентно:

   update table 
        set col5 = value 
        where col1 is not null;

Однако, если вы специально хотели получить оба результата,Вы можете использовать временную таблицу:

create procedure myproc
as
begin
    select col1, col2, col3 
    into #tempt
    from table;

    update table 
    set col5 = value 
    where col1 in (select col1 from #tempt)
end;
0 голосов
/ 02 ноября 2019

Если вы не хотите подзапросить, вы можете присоединиться:

create procedure myproc
as
begin
    select col1, col2, col3 
    from table
    where 'some conditions'

    update t1 
    set col5 = value
    from table t1 
        inner join 
            (
                select col1
                    --obviusly you do not need this columns here..., col2, col3 
                from table
                where 'some conditions'
            )t2
        on t1.col1 = t2.col1
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...