tsql: может ли «возврат выбора» предшествовать «обновлению»?

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я хочу написать хранимую процедуру t-sql (она же sproc), которая выбирает 3 столбца из «MyTable». Кроме того, я хочу обновить таблицу в том же sproc:

  1. Я выбираю третье значение из таблицы.
  2. Если оно равно «true», я хочу обновить соответствующую запись в таблице до «false»

Я не был уверен, какой синтаксис мне следует использовать. Не могли бы вы мне помочь?

 ALTER procedure [dbo].[My_PROC]
    @ID varchar(10)
AS
BEGIN

    declare @Col3 bit;

    set @Col3 = select Col3
    from dbo.MyTable  with (nolock)
    where @ID = ID


    if @Col3 = 'true'  
        update dbo.dbo.MyTable set col3 = 'false'
        where @ID = ID

    select Col1, 
    Col2, 
    Col3
    from dbo.MyTable table  with (nolock) where @ID = ID,
    table.Col1,
    table.Col2,
    @Col3   
END
 

редактировать: я хочу вернуть исходное значение Col3 (а не обновленное значение).

Комментарии:

1. «пользовательская процедура (она же usp)» не является общепринятой терминологией — хранимые процедуры (они же «sprocs») обычно не различаются между пользователем и системой. Системные sprocs существуют, но поскольку у вас нет доступа для их изменения, различие является спорным.

Ответ №1:

Используйте:

 ALTER procedure [dbo].[My_PROC]
    @ID varchar(10)
AS
BEGIN

    SELECT t.col1, 
           t.col2, 
           t.col3
      FROM dbo.MyTable AS t WITH (NOLOCK)
     WHERE t.id = @ID

    -- No need for an IF statement to determine updating...
    UPDATE dbo.dbo.MyTable 
       SET col3 = 'false'
     WHERE id = @ID
       AND t.col3 = 'true'

END
 

Я не знаю, что вы собираетесь делать в финале SELECT , но я могу обновить его, как только пойму, что вы задумали.

Комментарии:

1. Спасибо. Я хочу вернуть исходное значение Col3 (а не обновленное значение).

2. @Elad Benda: Затем измените порядок запросов в обратном порядке. Обновил ответ в соответствии с требованиями, хотя это, конечно, не было очевидно или упоминалось изначально.

3. Спасибо. Просто для любопытства: как я могу выбрать некоторые значения из таблицы, а некоторые из переменных sql? (Я понимаю, что мой вопрос был неясен — я думаю, мне следовало повторить его не только в названии)

4. @Elad Benda: отправьте новый вопрос и предоставьте псевдокод или как можно больше TSQL.

5. Но в этом вопросе есть необходимый tsql: я устанавливаю переменную «@Col3», а затем хочу ее получить. Мой выбор получает Col1, Col2 и «@col3». Я понимаю, что вы обошли его, как и следовало, но я хочу узнать, как это сделать в целом

Ответ №2:

Если вы используете SQL Server 2005 или более поздней версии, вы можете использовать предложение OUTPUT для вывода исходного значения, если оно действительно было обновлено запросом. Однако выходные данные не дадут вам исходное значение, если строка не обновляется запросом.

     declare @t table (
      ID int,
      tf bit
    );

    insert into @t values
      (1,0),
      (2,1),
      (3,0);

    declare @ID int = 2;

    select * from @t

    update @t set
      tf = 0
    output deleted.ID, deleted.tf
    where ID = @ID;

    select * from @t;