SQL-Server - обновлять, используя внутреннее соединение, с выводом, используя также внутреннее соединение. - PullRequest
0 голосов
/ 29 октября 2018

Я выполняю Update_1, но теперь мне нужно вернуть обновленную строку моим пользователям, поэтому я ищу OUTPUT , я попробовал Update_2, но не работает. Я действительно хотел бы узнать, как использовать OUTPUT, возможно, запрос для вас не имеет смысла, я перевожу запросы и сокращаю их для лучшего понимания. Мы должны отправить нашим клиентам обновленные строки по сокетам, я хотел бы сделать это без выполнения выбора, как только у меня уже есть обновленный идентификатор в inserted, но я пойму, если это невозможно. Спасибо за вашу помощь.

Update_1:

UPDATE items
SET items.status = 'sold-out'
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE orderDetail.id = 7

Update_2:

UPDATE items
SET items.status = 'sold-out'
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE orderDetail.id = 7
OUTPUT items.id, items.description, orderDetail.id
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE items.id = inserted.id

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

OUTPUT приходит сразу после предложения SET. Вы можете выбрать из inserted или любой из таблиц, упомянутых далее в предложении FROM. Похоже, вы просто должны иметь:

UPDATE items
SET items.status = 'sold-out'
OUTPUT inserted.id, inserted.description, orderDetail.id
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE orderDetail.id = 7

Вы должны всегда сверяться с синтаксисом для целого оператора , чтобы увидеть, как различные части T-SQL объединяются вместе.

0 голосов
/ 29 октября 2018

Из документации видно, что то, что вы пытаетесь сделать, не сработает. Оператор вывода использует «виртуальные» таблицы Inserted и Deleted аналогично триггеру. Один пример заявления:

UPDATE Production.Document  
SET DocumentSummary .WRITE (N'features',28,10)  
OUTPUT deleted.DocumentSummary,   
       inserted.DocumentSummary   
    INTO @MyTableVar  
WHERE Title = N'Front Reflector Bracket Installation';  

То есть делать то, что вы хотите, было бы примерно так:

DECLARE @temptable table (  
    id int,
    description nvarchar(max));  

UPDATE items
SET items.status = 'sold-out'
FROM items
INNER JOIN orderDetail
ON orderDetail.itemId = items.id
WHERE orderDetail.id = 7
OUTPUT inserted.id, inserted.description into @temptable

select @temptable.id, @temptable.description, orderdetail.id as orderdetailid
FROM @temptable
INNER JOIN orderDetail
ON orderDetail.itemId = @temptable.id

Я не гарантирую, что приведенный выше код будет правильно скомпилирован, но это дает вам представление. Документация для предложения вывода здесь: https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

...