Richten Sie den OUTPUT einer UPDATE-Anweisung an eine lokale Variable

12

Ich möchte dies tun:

DECLARE @Id INT;

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

Ist das überhaupt möglich? Ich weiß, dass ich eine lokale Tabellenvariable deklarieren und die Ausgabe dorthin leiten kann, aber ich würde es vorziehen, wenn möglich, sie zu überspringen

Andrei Rînea
quelle

Antworten:

15

Nein, da Sie möglicherweise OUTPUTmehrere Zeilen tönen, die nicht in eine skalare Variable passen würden.

Sie müssen in eine @TableVariable oder deklarierte Tabelle ausgeben, um mehrere Ausgabezeilen verarbeiten zu können.

JNK
quelle
Ja. Selbst wenn die E-Mail-Adresse eindeutig ist, ist es nicht möglich, sie mit zusammensetzbarer DML und einer einzelnen Zuweisung zu hacken SELECT. Ich erhalte den Fehler "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."Dies ist ein bisschen unglücklich, weil es eine wirklich saubere Lösung ist, wenn Sie wissen, dass Sie nur eine einzelne Zeile betreffen.
Jon Seigel
Ich verstehe. Ich kann jedoch sagen, dass SELECT @JNK = SomeColumn FROM SomeTable WHERE SomeOtherColumn = MatchesMultipleRows ... Warum wurde diese Einschränkung hier nicht angewendet? Wie auch immer, danke und ich werde einfach eine lokale Tabellenvariable deklarieren und damit fertig sein. Das Leben geht weiter. :)
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
quelle