Direcione o OUTPUT de uma instrução UPDATE para uma variável local

12

Eu gostaria de fazer isso:

DECLARE @Id INT;

UPDATE Logins
SET    SomeField = 'some value'
OUTPUT @Id = Id
WHERE  EmailAddress = @EmailAddress -- this is a parameter of the sproc

Isso é possível? Eu sei que posso declarar uma variável de tabela local e direcionar a saída para lá, mas eu preferiria ignorá-la, se possível

Andrei Rînea
fonte

Respostas:

15

Não, porque você potencialmente OUTPUTting várias linhas, o que não caberia em uma variável escalar.

Você precisa gerar uma @Tabletabela variável ou declarada para lidar com várias linhas de saída.

JNK
fonte
Sim. Mesmo se o endereço de e-mail for único, não é possível invadi-lo usando DML composível e uma única atribuição SELECT. Eu recebo o erro "A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement."Isso é meio lamentável, porque é uma solução realmente limpa quando você sabe que está afetando apenas uma única linha.
21812 Jon Seigel
Compreendo. No entanto, posso dizer SELECT @JNK = SomeColumn FROM SomeTable WHERE SomeOtherColumn = MatchesMultipleRows ... Então, por que essa restrição não foi aplicada aqui? De qualquer forma, obrigado e vou declarar uma variável de tabela local e pronto. A vida continua. :)
Andrei Rînea
0
declare @status_atividade bit;

update t1 set         
    t1.idioma = t2.idioma, 
    t1.regiao = t2.regiao, 
    t1.fuso_horario = t2.fuso_horario,
    @status_atividade = t2.status_atividade

from 
    @usuario as t1  
join 
    dbo.locatario as  t2 
on 
    t1.id_locatario = t2.id_locatario

select @status_atividade
Rangel Borene
fonte