Я могу ошибаться, но, похоже, в этом случае вам не нужно иметь только одно утверждение.Я также не вижу, что это подразумевается, поскольку вы говорили только о выражении UPDATE , что не означает, что у вас не может быть никаких других утверждений, готовящих обновление, не так ли?Но если ты это имел в виду, прости меня, пожалуйста, но я собираюсь идти дальше.:)
Во-первых, я хотел бы знать, действительно ли в вашем Column_Order
нет пробелов.Потому что, если нет пробелов и , значения начинаются с 1, тогда решение cyberkiwi можно обойтись только с этой модификацией (однако все кредиты должны идти этому человеку):
declare @order int;
set @order = :order;
update P_Columns
set Column_Order =
case
when Column_Order = @order then Column_Order - 1
else Column_Order + 1
end
where Column_Order in (@order, @order - 1) and @order > 1
То есть вам нужно объявить @var, чтобы вы использовали :order
только один раз для скрипта.(Возможно, вы уже знали об этом.) И вот, пожалуйста.
Однако, если это решение не может быть применено как есть, тогда, в принципе, я думаю, вам просто нужно добавить больше операторов, чтобы вычислить заранее другоестоимость заказа должна быть обменена, затем обновите.
Вот как это может быть:
declare @order int, @prev_order int;
set @order = :order;
/* here goes looking up for the other Column_Order */
select @prev_order = max(Column_Order)
from P_Columns
where Column_Order < @order;
/* and now update, which is basically the same,
only adapted for use with @prevorder,
and also we check if @prevorder has a value */
if @prevorder is not null
update P_Columns
set Column_Order =
case Column_Order
when @order then @prevorder
else @order
end
where Column_Order in (@order, @prevorder)
Если у вас есть какие-либо вопросы, они приветствуются.