Ответ 1
With cte as (
select top(1) shipfirtsname
From ShipBillInfo
where CustomerId='134'
order by OredrGUID desc)
Update cte set shipfirstname='abc';
Выполняется следующий запрос:
update top(1) ShipBillInfo
set shipfirstname='kkk'
where CustomerId='134';
но он показывает ошибку, если я пытаюсь заказать некоторый Id: например:
update top(1) ShipBillInfo
set shipfirstname='kkk'
where CustomerId='134'
order by
OredrGUID desc;
With cte as (
select top(1) shipfirtsname
From ShipBillInfo
where CustomerId='134'
order by OredrGUID desc)
Update cte set shipfirstname='abc';
почему вы не делаете:
update ShipBillInfo
set shipfirstname='kkk'
where OrderGUID = (select top (1) OrderGUID
from ShipBillInfo
where CustomerId = 134
order by OredrGUID desc )
Для решения потокобезопасного решения ни один из предлагаемых решений не работал у меня (некоторые строки обновлялись несколько раз, когда выполнялись одновременно).
Это сработало:
UPDATE Account
SET sg_status = 'A'
WHERE AccountId =
(
SELECT TOP 1 AccountId
FROM Account WITH (UPDLOCK) --this makes it thread safe
ORDER BY CreationDate
)
Если вы хотите вернуть некоторый столбец обновленного элемента, вы можете поместить его в свой оператор обновления: OUTPUT INSERTED.AccountId
(между SET
и WHERE
)